dbms_out返回第1列:PLS-00428:SELECT语句中需要INTO子句

时间:2015-02-11 14:22:33

标签: oracle oracle-sqldeveloper

在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:

当我一个接一个地运行这两个语句时,它工作正常。 那么为什么我会得到错误以及如何避免错误?

非常感谢,

2 个答案:

答案 0 :(得分:3)

例如,如果您要打印表格的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;

答案 1 :(得分:3)

您正在混淆SQL和PL / SQL语句,如评论中所述。你可以选择一些东西,但你要么得到一行数据,要么选择一个集合然后手动迭代,就像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 Developer中,使用客户端prompt command而不是dbms_output

prompt schema > table > key
SELECT 'table_name' TABLE_NAME , t.* FROM table_name  t;