我希望从我的架构上的所有表中获取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;
有人知道为什么或可以帮我解决这个问题?
答案 0 :(得分:2)
&#34;我需要从我的架构上的所有表中导出20条记录。我有一个计划在sqlplus中执行它并使用spool选项&#34;
保存输出
您可以这样做,但这是一个两步过程:
.sql
文件在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,则将保留标识符的区分大小写,并且在查询中需要双引号。