如何将Oracle查询的结果显示到控制台

时间:2018-02-23 12:17:00

标签: sql oracle plsql

我希望从我的架构上的所有表中获取20条记录,但我的代码不起作用。

BEGIN
    FOR R IN (SELECT table_name FROM user_tables) LOOP
        EXECUTE IMMEDIATE 'dbms_output.put_line(select * from '||r.table_name||' where rownum<=20)';
    END LOOP;
END;

有人知道为什么或可以帮我解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

&#34;我需要从我的架构上的所有表中导出20条记录。我有一个计划在sqlplus中执行它并使用spool选项&#34;

保存输出

您可以这样做,但这是一个两步过程:

  1. 生成SELECT语句并将其假脱机到.sql文件
  2. 运行生成的脚本
  3. 在SQL * Plus中是这样的:

    SQL> set heading off
    SQL> set feedback off
    SQL> spool get20rows.sql
    SQL> select 'prompt '||table_name from user_tables;
    SQL> select 'select * from '||table_name||' where rownum <= 20;'
    SQL> from user_tables;
    SQL> spool off
    SQL> 
    SQL> spool get20rows.out
    SQL> @get20rows.sql
    SQL> spool off
    

    改善假脱机布局留给读者练习:)正如@Williamrobertson所观察到的......

      

    由于包装

    ,普通select * from sometable的结果通常是不可读的

答案 1 :(得分:1)

要输出SQL查询,您不需要EXECUTE IMMEDIATE,只需直接致电DBMS_OUTPUT.PUT_LINE

BEGIN
  FOR R IN (SELECT table_name FROM user_tables) LOOP
    DBMS_OUTPUT.PUT_LINE( 'select * from "'||r.table_name||'" where rownum<=20;' );
  END LOOP;
END;
/

然后您可以运行输出的语句以获得所需的结果。

此外,默认情况下,标识符是使用大写名称创建的;但是,如果用户使用双引号创建表/列/ etc,则将保留标识符的区分大小写,并且在查询中需要双引号。