본문 바로가기

C-Language/Pro C, WHENEVER

Pro C, WHENEVER

Pro C, WHENEVER

WHENEVER 문장은 오라클이 SQL문장 실행 중에 발생하는 경고나 오류에 따라 대처할 로직을 지정한다.
WHENEVER문장을 사용하지 않는다면 오라클이 발행하는 오류나 경고에 대응 없이 프로그램은 계속 실행될 것이다.

lWHENEVER 이용해서, Oracle Error, SQLERROR, SQLWARNING NOT FOUND 발생했을때의 처리를 지정함WHENEVER <condition> <action>

<condition>
SQLWARNING
SQLERROR
NOT FOUND : FETCH, INTO 절에서 조건을 만족하는 행이 발견되지 않았을 경우

<action>
CONTINUE; 아무런 대응 없이 그냥 다음으로 진행, WHENEVER를 사용하지 않은 것과 동일함
DO 함수명(); 오류에 대응하는 함수를 호출, 이 함수가 종료하면 오류가 발생한 다음으로 제어가 진행됨
DO break; 반복문의 break
DO continue; 반복문의 continue
GOTO lable name;
STOP; 프로그램 중지, 트랜잭션 롤백됨

최초의 SQL문장보다 먼저 선언되어야 함.

동일한 WHENEVER 조건이 다음에 다시 선언된다면 먼저 선언된 조건은 무시됨.

DO 함수명() 예
EXEC SQL WHENEVER SQLERROR DO sql_error("입력오류");
EXEC SQL
INSERT INTO employees (empno, ename, sal)
VALUES (1000, '홍길동', 2000);

EXEC SQL WHENEVER SQLERROR DO sql_error("변경 중에 오류 발생");
EXEC SQL
UPDATE employees
SET sal = :sal
WHERE
       empno = :empno;


DO break | continue, GOTO lable 예
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL WHENEVER SQLERROR DO continue;
EXEC SQL WHENEVER SQLWARNING GOTO warning_lable;
while (1)
{
        EXEC SQL FETCH my_cursor INTO :emp;
        printf("%s %7.2f %9.2f \n", emp.ename, emp.sal, emp.comm);
}
EXEC SQL CLOSE my_cursor;
exit(EXIT_SUCCESS);

warning_lable:
printf("SQL 경고 발생");