GOTO 语句使执行点跳转到具有指定标签的语句。

GOTO 语句的语法为:

GOTO label

label 是分配给可执行语句的名称。label 必须在函数、存储过程或匿名块的范围内是唯一的。

要标记语句,请使用语法:

<<label>> statement

statement 是程序跳转到的执行点。

您可以标记赋值语句、任何 SQL 语句(如 INSERT、UPDATE、CREATE 等)和所选的存储过程语言语句。可标记的存储过程语言语句是:

  • IF
  • EXIT
  • RETURN
  • RAISE
  • EXECUTE
  • PERFORM
  • GET DIAGNOSTICS
  • OPEN
  • FETCH
  • MOVE
  • CLOSE
  • NULL
  • COMMIT
  • ROLLBACK
  • GOTO
  • CASE
  • LOOP
  • WHILE
  • FOR

请注意,exit 被视为关键字,不能用作标签的名称。

GOTO 语句不能将控制权转移到 条件块或子块,但可以从 条件块或子块转移控制权。

以下示例验证员工记录是否包含姓名、工作描述和员工雇佣日期;如果缺少任何一条信息,GOTO 语句会将执行点转移到输出员工无效的消息的语句。

CREATE OR REPLACE PROCEDURE verify_emp (
    p_empno         NUMBER
)
IS
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_hiredate      emp.hiredate%TYPE;
BEGIN
    SELECT ename, job, hiredate
        INTO v_ename, v_job, v_hiredate FROM emp
        WHERE empno = p_empno;
    IF v_ename IS NULL THEN
        GOTO invalid_emp;
    END IF;
    IF v_job IS NULL THEN
        GOTO invalid_emp;
    END IF;
    IF v_hiredate IS NULL THEN
        GOTO invalid_emp;
    END IF;
    DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno ||
        ' validated without errors.');
    RETURN;
    <<invalid_emp>> DBMS_OUTPUT.PUT_LINE('Employee ' || p_empno ||
        ' is not a valid employee.');
END;

GOTO 语句具有以下限制:

  • GOTO 语句不能跳转到声明。
  • GOTO 语句不能将控制权转移到另一个函数或存储过程。

label 不应该位于块、函数或存储过程的末尾。