다른 언어의 GOTO랑 비슷하다. LABEL이 지정된 block이나 statement로 갈 수 있다.
GOTO label_name;
label name은 <<label_name>> 이렇게 표시한다.
BEGIN
GOTO second_message;
<<first_message>>
DBMS_OUTPUT.PUT_LINE( 'Hello' );
GOTO the_end;
<<second_message>>
DBMS_OUTPUT.PUT_LINE( 'PL/SQL GOTO Demo' );
GOTO first_message;
<<the_end>>
DBMS_OUTPUT.PUT_LINE( 'and good bye...' );
END;
--익명 블록이 완료되었습니다.
--PL/SQL GOTO Demo
--Hello
--and good bye...
second_message -> first_message -> the_end 로 향하는 것을 알 수 있다. 그림으로 보면 이렇게 진행된다.
GOTO문은 몇 가지의 제한사항을 가지고 있다.
1. GOTO문을 사용하여 IF, CASE, LOOP 문으로 보낼 수 없다.
DECLARE
n_sales NUMBER;
n_tax NUMBER;
BEGIN
GOTO inside_if_statement;
IF n_sales > 0 THEN
<<inside_if_statement>>
n_tax := n_sales * 0.1;
END IF;
END;
--오류 보고 -
--ORA-06550: 줄 5, 열5:PLS-00375: 부당한 GOTO 문; 해당 GOTO는 레이블 'INSIDE_IF_STATEMENT'(으)로 분기할 수 없습니다
--ORA-06550: 줄 6, 열20:PL/SQL: Statement ignored
--06550. 00000 - "line %s, column %s:\n%s"
--*Cause: Usually a PL/SQL compilation error.
--*Action:
다음 예제를 실행했을 때 GOTO문이 분기할 수 없다고 나타난다. 이와같이 조건절 이하에는 GOTO문이 개입할 수 없다.
2. GOTO는 IF에서 ELSE IF 또는 ELSE, WHEN에서 CASE로와 같이 다른 절로 보낼 수 없다.
DECLARE
n_sales NUMBER;
n_commission NUMBER;
BEGIN
n_sales := 120000;
IF n_sales > 100000 THEN
n_commission := 0.2;
GOTO zero_commission;
elsif n_sales > 50000 THEN
n_commission := 0.15;
elsif n_sales > 20000 THEN
n_commission := 0.1;
ELSE
<<zero_commission>>
n_commission := 0;
END IF;
END;
오류 보고 -
ORA-06550: 줄 8, 열5:PLS-00375: 부당한 GOTO 문; 해당 GOTO는 레이블 'ZERO_COMMISSION'(으)로 분기할 수 없습니다
ORA-06550: 줄 13, 열3:PL/SQL: Statement ignored
zerror_commission으로 보내지만 다른 else문에 존재하기 때문에 개입할 수 없다.
3. GOTO 문을 사용하여 서브 프로그램 또는 exception handler에서 제어를 전송할 수 없다.
4. GOTO 문을 사용하여 exception handler의 제어를 현재 블록으로 다시 전송할 수 없다.
'Database > PL SQL' 카테고리의 다른 글
PL/SQL Tutorial - LOOP (0) | 2019.05.08 |
---|---|
PL/SQL Tutorial - NULL (0) | 2019.05.07 |
PL/SQL Tutorial - CASE (0) | 2019.04.30 |
PL/SQL Tutorial - IF (0) | 2019.04.30 |
PL/SQL Tutorial - Type, Variables (0) | 2019.04.30 |