PL/SQL GOTO Statement
1. Introduction
GOTO 문을 사용하면 레이블이 지정된 블록 또는 문으로 컨트롤을 전송할 수 있다. 다음은 GOTO 문의 구문을 보여준다.
1
GOTO label_name;
label_name은 대상 문을 식별하는 레이블의 이름이다. 프로그램에서는 아래와 같이 라벨 이름을 이중으로 둘러싸는 angle brackets으로 둘러싼다.
1
<<label_name>>;
PL/SQL은 GOTO 문을 만나면 레이블 뒤에 있는 첫 번째 실행 가능 문으로 제어를 전송한다.
2. GOTO statement example
GOTO 문을 사용한 예이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
결과는 다음과 같다.
1
2
3
PL/SQL GOTO Demo
Hello
and good Bye...
블록의 순서를 자세히 설명한다.
첫째: GOTO second_message 문이 발생하므로 컨트롤은 second_message label 뒤에 있는 문으로 전달된다.
둘째: GOTO first_message가 발생하므로 컨트롤은 first_message label 다음에 문으로 전송된다.
셋째: GOTO the_end에 도달하여 the_end 라벨 뒤에 있는 문으로 컨트롤이 전달된다.
그림은 시퀀스를 보여준다.
3. GOTO statement restrictions
GOTO 문에는 다음과 같은 제한이 적용된다.
- 첫째: GOTO 문을 사용하여 컨트롤을 IF, CASE 또는 LOOP 문으로 전송할 수 없다.
다음 예에서는 GOTO 문을 사용하여 IF 문으로 컨트롤을 전송하려고 한다.
1
2
3
4
5
6
7
8
9
10
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;
Oracle에서 다음 오류를 발생시켰다.
1
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label 'INSIDE_IF_STATEMENT'
- 둘째: GOTO 문을 사용하여 IF 문의 한 절에서 다른 절로 제어권을 전송할 수 없는데, 예를 들어 IF 문에서 ELSIF 또는 ELSE 절로, 또는 CASE에서 WHEN 절이다.
다음 예에서는 IF 문의 절에 컨트롤을 전달하려고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
Oracle에서 다음 오류를 발생시켰다.
1
PLS-00375: illegal GOTO statement; this GOTO cannot branch to label 'ZERO_COMMISSION'
셋째: GOTO 문을 사용하여 하위 프로그램이나 예외 처리로 제어 권한을 전송할 수 없다.
넷째: GOTO 문을 사용하여 예외 처리에서 현재 블록으로 다시 제어 권한을 전송할 수 없다.
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.