首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

ORA-06550 / PLS-00428:PL/SQL 區塊中 SELECT 必須搭配 INTO 子句

     編輯:Oracle 資料庫基礎

在 PL/SQL 區塊(BEGIN ... END)中直接寫 SELECT * FROM table 會拋出 PLS-00428: an INTO clause is expected in this SELECT statement。本文說明原因與三種解決方案。

錯誤重現

BEGIN
  DELETE FROM ...;
  INSERT INTO ...;
  SELECT * FROM 表名;  -- 錯誤:純 SELECT 不能單獨出現在 PL/SQL 區塊
END;

錯誤畫面:

PLS-00428 錯誤畫面

根本原因

PL/SQL 區塊屬於程序式程式碼,不支援直接輸出結果集給用戶端。SELECT 必須將查詢結果存入變數(INTO)、游標(OPEN ... FOR)或作為 DML 的子查詢使用。

三種解決方案

方案一:SELECT INTO 變數(單筆結果)

DECLARE
  v_id   NUMBER;
  v_name VARCHAR2(100);
BEGIN
  SELECT id, name INTO v_id, v_name FROM 表名 WHERE rownum = 1;
  DBMS_OUTPUT.PUT_LINE('ID=' || v_id || ', Name=' || v_name);
END;

方案二:游標 FOR 迴圈(多筆結果)

BEGIN
  FOR rec IN (SELECT * FROM 表名) LOOP
    DBMS_OUTPUT.PUT_LINE(rec.id || ' - ' || rec.name);
  END LOOP;
END;

方案三:開啟 REF CURSOR 回傳給呼叫端(Java/.NET/報表工具)

CREATE OR REPLACE PROCEDURE get_data(p_cur OUT SYS_REFCURSOR) IS
BEGIN
  OPEN p_cur FOR SELECT * FROM 表名;
END;

最佳實務建議

  • PL/SQL 區塊中禁止出現裸露的 SELECT,必須搭配 INTO、游標或 BULK COLLECT。
  • 若只是想在 SQL*Plus/Developer 中測試查詢,直接執行 SELECT 陳述式,勿包在 BEGIN ... END 內。
  • 存儲過程回傳結果集時,統一使用 SYS_REFCURSOR(Oracle 9i+),避免弱型別游標維護困難。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved