在 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;
錯誤畫面:
PL/SQL 區塊屬於程序式程式碼,不支援直接輸出結果集給用戶端。SELECT 必須將查詢結果存入變數(INTO)、游標(OPEN ... FOR)或作為 DML 的子查詢使用。
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;
BEGIN
FOR rec IN (SELECT * FROM 表名) LOOP
DBMS_OUTPUT.PUT_LINE(rec.id || ' - ' || rec.name);
END LOOP;
END;
CREATE OR REPLACE PROCEDURE get_data(p_cur OUT SYS_REFCURSOR) IS
BEGIN
OPEN p_cur FOR SELECT * FROM 表名;
END;
INTO、游標或 BULK COLLECT。BEGIN ... END 內。SYS_REFCURSOR(Oracle 9i+),避免弱型別游標維護困難。