DECLARE HANDLER문은 예외를 핸들링하기 위한 오류 핸들러를 작성합니다.
명시적으로 선언된(BEGIN...END) 범위와 내재적으로 선언된 범위(예: IF문의 ELSE 절) 모두에서 핸들러를 선언할 수 있습니다. 그러나 모든 핸들러 선언은 범위의 맨 위와 다른 명령문 앞에 함께 있어야 합니다.
예외가 없는 경우 핸들러의 존재는 SQL 프로그램의 작동 또는 성능에 영향을 주지 않습니다. 예외가 발생하는 경우 예외가 노드를 떠나거나(핸들러가 없는 것처럼) 일치하는 핸들러가 발견될 때까지 WebSphere Message Broker은 예외의 SQL 상태를 관련 핸들러와 연관된 SQL 상태와 비교합니다. 한 범위 내에서는 핸들러가 선언된 순서로 검색됩니다. 즉, 첫 번째에서 마지막으로 검색됩니다. 범위는 가장 안쪽에서 가장 바깥쪽으로 검색됩니다.
DECLARE... HANDLER... 문에서 제공된 SQL 상태 값은 예외의 SQL 상태와 직접 비교하거나 와일드카드 문자와 비교할 수 있습니다. 상태 값을 직접 비교하려면 VALUE를 지정하거나 조건 연산자를 지정하지 않습니다. 와일드카드를 비교하려면 밑줄과 퍼센트 문자를 사용하여 각각 단일 문자 와일드카드와 여러 문자 와일드카드를 나타내고 LIKE 연산자를 지정합니다. 와일드카드 메소드는 나열할 필요 없이 핸들링할 일반 유형의 모든 예외를 허용합니다.
일치하는 핸들러가 있는 경우 SQLSTATE 및 기타 특수 등록이 갱신되고(아래 설명된 규칙에 따라) 핸들러의 명령문이 처리됩니다.
핸들러의 명령문은 단일 명령문이어야 하므로 이 명령문은 주로 여러 개의 다른 명령문을 포함하는 복합 명령문(예: BEGIN...END)입니다. 이 내부 명령문과 연관된 특수 작동이 없으며 특수 제한사항이 없습니다. 예를 들어, RETURN, ITERATE 또는 LEAVE를 포함할 수 있고 범위 자체에 포함된 방식과 동일한 방식으로 루틴 포함 및 구조체 반복에 영향을 줍니다.
핸들러는 핸들러 자체에서 발생하는 예외를 위한 핸들러를 포함할 수 있습니다.
각 핸들러에는 자체의 SQLCODE, SQLSTATE, SQLNATIVEERROR 및 SQLERRORTEXT 특수 레지스터가 있습니다. 이것이 범위에 포함되고 값은 핸들러의 첫 번째 명령문이 실행되기 직전에 설정됩니다. 핸들러의 마지막 명령문이 실행될 때까지 올바른 상태로 남아 있습니다. 한 핸들러에서 다른 핸들러로 SQLSTATE 값이 전달되지 않으므로 핸들러를 독립적으로 기록할 수 있습니다.
핸들러는 예외를 제거하여 입력 노드에 도달할 수 없게 하므로 트랜잭션이 롤백되지 않고 확약됩니다. 핸들러는 RESIGNAL 또는 THROW 문을 사용하여 이를 방지할 수 있습니다.
-- Drop the tables so that they can be recreated with the latest definition. -- If the program has never been run before, errors will occur because you -- can't drop tables that don't exist. We ignore these. BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE LIKE'%' BEGIN END; PASSTHRU 'DROP TABLE Shop.Customers' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Invoices' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Sales' TO Database.DSN1; PASSTHRU 'DROP TABLE Shop.Parts' TO Database.DSN1; END;