dbms_out 返回第 1 列:PLS-00428:SELECT 语句中需要一个 INTO 子句
dbms_out returning column 1: PLS-00428: an INTO clause is expected in SELECT statement
运行 sql-developer 中的此查询:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t ;
END ;
我收到这条消息:
Error report -
ORA-06550: line 4, column 1: PLS-00428: an INTO clause is expected in
this SELECT statement
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
而当我 运行 两个语句一个一个地工作时,它工作正常。
那么为什么我会收到错误以及如何避免它?
非常感谢,
例如,如果您想打印 table 的第 COLUMN_NAME
列,您可以这样做:
DECLARE
TYPE TABLE_OBJ IS TABLE OF TABLE_NAME%ROWTYPE;
TABLE_T TABLE_OBJ;
BEGIN
SELECT * BULK COLLECT INTO TABLE_T FROM TABLE_NAME;
FOR i IN 1..TABLE_T.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TABLE_T(i).COLUMN_NAME1||','||TABLE_T(i).COLUMN_NAME2);
END LOOP;
END;
您混淆了 SQL 和 PL/SQL 语句,如评论中所述。你可以 select 进入某些东西,但你要么得到单行数据,要么 select 进入一个集合,然后手动迭代它,如 Aramillo 所示。
您可以使用 'cursor for-loop' 来遍历您的行:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
FOR rec IN (SELECT 'table_name' TABLE_NAME , t.* FROM table_name t)
LOOP
DBMS_OUTPUT.PUT_LINE (rec.COLUMN_NAME1||','||rec.COLUMN_NAME2);
END LOOP;
END;
/
但是考虑到您的出发点,将查询保留为计划 SQL 和 运行 在块之后更简单:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
END;
/
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t;
或在 SQL*Plus 或 SQL 开发人员中,使用客户端 prompt
command 而不是 dbms_output
:
prompt schema > table > key
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t;
运行 sql-developer 中的此查询:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t ;
END ;
我收到这条消息:
Error report -
ORA-06550: line 4, column 1: PLS-00428: an INTO clause is expected in
this SELECT statement
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
而当我 运行 两个语句一个一个地工作时,它工作正常。 那么为什么我会收到错误以及如何避免它?
非常感谢,
例如,如果您想打印 table 的第 COLUMN_NAME
列,您可以这样做:
DECLARE
TYPE TABLE_OBJ IS TABLE OF TABLE_NAME%ROWTYPE;
TABLE_T TABLE_OBJ;
BEGIN
SELECT * BULK COLLECT INTO TABLE_T FROM TABLE_NAME;
FOR i IN 1..TABLE_T.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(TABLE_T(i).COLUMN_NAME1||','||TABLE_T(i).COLUMN_NAME2);
END LOOP;
END;
您混淆了 SQL 和 PL/SQL 语句,如评论中所述。你可以 select 进入某些东西,但你要么得到单行数据,要么 select 进入一个集合,然后手动迭代它,如 Aramillo 所示。
您可以使用 'cursor for-loop' 来遍历您的行:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
FOR rec IN (SELECT 'table_name' TABLE_NAME , t.* FROM table_name t)
LOOP
DBMS_OUTPUT.PUT_LINE (rec.COLUMN_NAME1||','||rec.COLUMN_NAME2);
END LOOP;
END;
/
但是考虑到您的出发点,将查询保留为计划 SQL 和 运行 在块之后更简单:
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE ('schema > table > key ');
END;
/
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t;
或在 SQL*Plus 或 SQL 开发人员中,使用客户端 prompt
command 而不是 dbms_output
:
prompt schema > table > key
SELECT 'table_name' TABLE_NAME , t.* FROM table_name t;