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