database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1585 게시물 읽기
No. 1585
프로시저 안에서 exception 처리
작성자
이도희
작성일
2008-04-14 10:40
조회수
15,249

오라클 같은 경우 프로시저 안에서 exception  처리를 할 수 있어서 어디서 에러가 났는지 알 수 있던데 

DB2 같은 경우도 exception처리 해 주는 부분이 있나요?

이 글에 대한 댓글이 총 1건 있습니다.

조건 핸들러 선언

특정 조건이 발생할 때의 SQL 프로시저 동작을 정의하려면 조건 핸들러를 선언해야 합니다. 핸들러 선언의 일반 형식은 다음과 같습니다.

   DECLARE handler-type  HANDLER FOR condition SQL-procedure-statement 

DB2(R)에서 condition과 일치하는 조건을 발생시키면 DB2는 제어를 조건 핸들러로 전달합니다. 조건 핸들러는 handler-type에 의해 표시된 작업을 수행한 다음 SQL-procedure-statement를 실행합니다.

Handler-types
CONTINUE
SQL-procedure-statement가 완료된 후 오류를 일으킨 명령문의 다음 명령문으로 계속 실행함을 지정합니다.
EXIT
SQL-procedure-statement가 완료된 후 핸들러가 들어 있는 복합 명령문 끝에서 계속 실행함을 지정합니다.
UNDO
SQL-procedure-statement가 실행하기 전 DB2가 핸들러가 들어 있는 복합 명령문에서 발생하는 모든 SQL 조작을 롤백함을 지정합니다. SQL-procedure-statement가 완료된 후 핸들러가 들어 있는 복합 명령문의 끝에서 실행은 계속됩니다.
주:
ATOMIC 복합 명령문에서는 UNDO 핸들러만 선언할 수 있습니다.
Conditions
DB2에는 세 가지의 일반 조건이 있습니다.
NOT FOUND
SQLCODE가 +100 또는 SQLSTATE가 '02' 문자로 시작하는 모든 조건을 식별합니다.
SQLEXCEPTION
음수값의 SQLCODE를 초래하는 모든 조건을 식별합니다.
SQLWARNING
경고 조건(SQLWARN0가 'W'라는) 또는 +100이 아닌 양수값의 SQL 리턴 코드를 초래하는 모든 조건을 식별합니다. 대응하는 SQLSTATE의 값은 '01' 문자로 시작됩니다.
DECLARE문을 사용하여 특정 SQLSTATE에 대해 사용자 고유의 조건을 정의할 수도 있습니다.
SQL-procedure-statement
단일 SQL 프로시저 명령문을 사용하여 조건 핸들러의 동작을 정의할 수 있습니다. DB2는 BEGIN...END 블록으로 구분된 복합 명령문을 단일 SQL 프로시저 명령문으로 승인합니다. 복합 명령문을 사용하여 조건 핸들러의 동작을 정의하고 핸들러로 SQLSTATE 또는 SQLCODE 변수의 값을 유지하기 위해, 변수의 값을 복합 블록의 첫 번째 명령문에 있는 로컬 변수 또는 매개변수에 지정해야 합니다. 복합 블록의 첫 번째 명령문이 SQLSTATE 또는 SQLCODE의 값을 로컬 변수나 매개변수에 할당하지 않으면, DB2에서 조건 핸들러를 호출하게 만든 SQLSTATE와 SQLCODE 값을 유지할 수 없습니다.

다음 예는 간단한 조건 핸들러를 보여줍니다.

CONTINUE 핸들러
이 핸들러는 DB2가 NOT FOUND 조건을 발생시킬 때 1의 값을 at_end 로컬 변수에 지정합니다. 그러면 DB2는 NOT FOUND 조건을 발생시킨 명령문 다음의 명령문으로 제어를 전달합니다.
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET at_end = 1; 
EXIT 핸들러
이 예에서 EXIT 핸들러의 범위는 A라는 복합 명령문으로 제한됩니다. JAVELIN 테이블이 없으면 DROP문은 NO_TABLE 조건을 발생시킵니다. 복합 명령문 A에 있는 명령문을 사용하지 않고도 EXIT 핸들러가 활성화되고 OUT_BUFFER가 문자열 'Table does not exist'로 설정되며 실행은 C의 INSERT문으로 계속됩니다. DROP문이 완료되면 핸들러가 활성화되지 않고 실행은 B의 SET문으로 계속됩니다.
   CREATE PROCEDURE EXIT_TEST ()
      LANGUAGE SQL
      BEGIN
      DECLARE OUT_BUFFER VARCHAR(80); 
      DECLARE NO_TABLE CONDITION FOR SQLSTATE '42704';

    A: BEGIN
    DECLARE EXIT HANDLER FOR NO_TABLE
      BEGIN
               SET OUT_BUFFER='Table does not exist';
     END;

            -- Drop potentially nonexistent table:
            DROP TABLE JAVELIN;

         B: SET OUT_BUFFER='Table dropped successfully';
     END;

      -- Copy OUT_BUFFER to some message table:
      C: INSERT INTO MESSAGES VALUES OUT_BUFFER;
    END 
UNDO 핸들러
이 예에서 UNDO 핸들러의 범위는 A라는 복합 명령문으로 제한됩니다. JAVELIN 테이블이 없으면 DROP문은 NO_TABLE 조건을 발생시킵니다. 복합 명령문 A에 있는 명령문을 사용하지 않고도 UNDO 핸들러가 활성화되고 DROP 이전의 INSERT가 롤백되며 OUT_BUFFER가 문자열 'Table does not exist'로 설정된 후 실행은 C의 INSERT문으로 계속됩니다. DROP문이 완료되면 핸들러가 활성화되지 않고 실행은 B의 SET문으로 계속됩니다.
   CREATE PROCEDURE UNDO_TEST ()
      LANGUAGE SQL
      BEGIN
      DECLARE OUT_BUFFER VARCHAR(80);
      DECLARE NO_TABLE CONDITION FOR SQLSTATE '42704';

      A: BEGIN ATOMIC
            DECLARE UNDO HANDLER FOR NO_TABLE
      BEGIN
               SET OUT_BUFFER='Table does not exist';
     END;

            INSERT INTO MESSAGES VALUES
               'This message will be removed by a rollback.';

            -- Drop potentially nonexistent table:
            DROP TABLE JAVELIN;

         B: SET OUT_BUFFER='Table dropped successfully';
     END;

      -- Copy OUT_BUFFER to some message table:
      C: INSERT INTO MESSAGES VALUES OUT_BUFFER;
    END 
조는 냥이님이 2008-04-14 11:32에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1591SQL문장 단위 알아내는 법 [1]
조성환
2008-04-18
9813
1590프로시저 안에서 에러처리 다시 질문드립니다. [1]
이도희
2008-04-17
10694
1586이거 왜이럴까요?? [2]
김희섭
2008-04-16
10028
1585프로시저 안에서 exception 처리 [1]
이도희
2008-04-14
15249
1584DB2 사용페이지수에 따른 사용률 구하는법좀 가르처 주세요. [6]
김형후
2008-04-10
12019
1583좀 도와줍쇼~~~^^ connection 권한설정하는것 궁금합니다... [1]
김성태
2008-04-09
10113
1582[DB2] 42501 에러 메시지 관련 질의 사항입니다. [1]
잠자리
2008-04-08
15892
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.038초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다