PL/SQL User's Guide and Reference Release 2 (9.2) Part Number A96624-01 |
|
PL/SQL Language Elements, 24 of 52
The GOTO
statement branches unconditionally to a statement label or block label. The label must be unique within its scope and must precede an executable statement or a PL/SQL block. The GOTO
statement transfers control to the labelled statement or block. For more information, see "GOTO Statement".
This is an undeclared identifier that labels an executable statement or a PL/SQL block. You use a GOTO
statement to transfer control to the statement or block following <<label_name>>
.
Some possible destinations of a GOTO
statement are not allowed. In particular, a GOTO
statement cannot branch into an IF
statement, LOOP
statement, or sub-block. For example, the following GOTO
statement is not allowed:
BEGIN ... GOTO update_row; -- can't branch into IF statement ... IF valid THEN ... <<update_row>> UPDATE emp SET ... END IF;
From the current block, a GOTO
statement can branch to another place in the block or into an enclosing block, but not into an exception handler. From an exception handler, a GOTO
statement can branch into an enclosing block, but not into the current block.
If you use the GOTO
statement to exit a cursor FOR
loop prematurely, the cursor is closed automatically. The cursor is also closed automatically if an exception is raised inside the loop.
A given label can appear only once in a block. However, the label can appear in other blocks including enclosing blocks and sub-blocks. If a GOTO
statement cannot find its target label in the current block, it branches to the first enclosing block in which the label appears.
A GOTO
label cannot precede just any keyword. It must precede an executable statement or a PL/SQL block. For example, the following GOTO
statement is not allowed:
FOR ctr IN 1..50 LOOP DELETE FROM emp WHERE ... IF SQL%FOUND THEN GOTO end_loop; -- not allowed END IF; ... <<end_loop>> END LOOP; -- not an executable statement
To debug the last example, simply add the NULL
statement, as follows:
FOR ctr IN 1..50 LOOP DELETE FROM emp WHERE ... IF SQL%FOUND THEN GOTO end_loop; END IF; ... <<end_loop>> NULL; -- an executable statement that specifies inaction END LOOP;
|
Copyright © 1996, 2002 Oracle Corporation. All Rights Reserved. |
|