首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle PL/SQL GOTO 語句用法與三大經典範例

     編輯:Oracle 資料庫相關知識

GOTO 屬於 PL/SQL 循序控制結構,無條件跳轉至指定標籤(<<label>>)。雖語法合法,但極難控制與維護,實務上強烈建議避免使用,僅作教學或極少數邊界情況參考。

語法規則

  • 標籤宣告:<<label_name>>(區塊內唯一)。
  • 跳轉指令:GOTO label_name;
  • 標籤後必須緊接可執行陳述式,若需跳至區塊末尾,需加 NULL; 佔位。

範例 1:判斷質數(提前跳出迴圈)

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;

範例 2:避免「標籤後無可執行陳述式」錯誤

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;

範例 3:跳轉至外層區塊標籤

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;

最佳實踐建議

  1. 優先使用結構化控制流:IF/ELSE、LOOP/EXIT、CASE、EXCEPTION。
  2. 若必須用 GOTO,限制在單一子程式內、標籤語意清晰、加註解說明跳轉原因。
  3. 程式碼審查時將 GOTO 列為必須重構項目。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved