GOTO 屬於 PL/SQL 循序控制結構,無條件跳轉至指定標籤(<<label>>)。雖語法合法,但極難控制與維護,實務上強烈建議避免使用,僅作教學或極少數邊界情況參考。
<<label_name>>(區塊內唯一)。GOTO label_name;NULL; 佔位。DECLARE
p VARCHAR2(30);
n PLS_INTEGER := 37;
BEGIN
FOR j IN 2 .. ROUND(SQRT(n)) LOOP
IF n MOD j = 0 THEN
p := ' is not a prime number';
GOTO print_now;
END IF;
END LOOP;
p := ' is a prime number';
<<print_now>>
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);
END;
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1 .. 50 LOOP
IF done THEN
GOTO end_loop;
END IF;
<<end_loop>>
NULL; -- 必須加 NULL 否則編譯錯誤
END LOOP;
END;
DECLARE
v_last_name VARCHAR2(25);
v_emp_id NUMBER(6) := 120;
BEGIN
<<get_name>>
SELECT last_name INTO v_last_name FROM employees WHERE employee_id = v_emp_id;
BEGIN
DBMS_OUTPUT.PUT_LINE(v_last_name);
v_emp_id := v_emp_id + 5;
IF v_emp_id < 120 THEN
GOTO get_name; -- 跳至外層區塊標籤
END IF;
END;
END;
IF/ELSE、LOOP/EXIT、CASE、EXCEPTION。GOTO,限制在單一子程式內、標籤語意清晰、加註解說明跳轉原因。GOTO 列為必須重構項目。