본문 바로가기

Database/PL SQL

PL/SQL Tutorial - GOTO

 다른 언어의 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