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 不应该位于块、函数或存储过程的末尾。