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 不應該位于塊、函數或存儲過程的末尾。