PL/SQL User's Guide and Reference

Contents Index Home Previous Next

GOTO Statement

Description

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" [*].

Syntax

label_declaration ::=

<<label_name>>

goto_statement ::=

GOTO label_name;

Keyword and Parameter Description

label_name

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>>.

Usage Notes

Some possible destinations of a GOTO statement are illegal. In particular, a GOTO statement cannot branch into an IF statement, LOOP statement, or sub-block. For example, the following GOTO statement is illegal:

BEGIN
   ...
   GOTO update_row;  -- illegal branch into IF statement
   ...
   IF valid THEN
      ...
      <<update_row>>
      UPDATE emp SET ...
   END IF;
END;

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.

Examples

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 illegal:

BEGIN
   ...
   FOR ctr IN 1..50 LOOP
      DELETE FROM emp WHERE ...
      IF SQL%FOUND THEN 
         GOTO end_loop;  -- illegal
      END IF;
      ...
   <<end_loop>>
   END LOOP;   -- not an executable statement
END;

To debug the last example, simply add the NULL statement, as follows:

BEGIN
   ...
   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;
END;

For more examples of legal and illegal GOTO statements, see "GOTO Statement" [*].


Contents Index Home Previous Next