如何使用pl sql中的匿名块打印出整个表?
Posted
技术标签:
【中文标题】如何使用pl sql中的匿名块打印出整个表?【英文标题】:how to print out the whole table using anonymous block in pl sql? 【发布时间】:2010-02-27 17:41:55 【问题描述】:我想使用DBMS_OUTPUT.PUT_LINE
,但行数仅超过 1。表中没有任何内容按顺序递增,所以我不能使用循环。有没有办法打印出表格中的每一行?
【问题讨论】:
【参考方案1】:尝试这样的事情。
SET SERVEROUTPUT ON
BEGIN
-- A PL/SQL cursor
FOR cursor1 IN (SELECT * FROM table1)
LOOP
DBMS_OUTPUT.PUT_LINE('Column 1 = ' || cursor1.column1 ||
', Column 2 = ' || cursor1.column2);
END LOOP;
END;
/
【讨论】:
如何增加光标移动到下一行? 你不需要——像上面这样的隐式游标会自动获取下一行,并在没有更多行可获取时退出。 在浪费了很多时间之后,我发现你的FOR
LOOP 应该在BEGIN -- END
里面【参考方案2】:
这可能会有所帮助:
BEGIN
FOR MY_CURSOR IN (SELECT COLUMN1,COLUMN2,COLUMN3 FROM MY_TABLE)
LOOP
DBMS_OUTPUT.PUT_LINE('COLUMN1 = ' || MY_CURSOR.COLUMN1 ||',
COLUMN2 = ' || MY_CURSOR.COLUMN2 ||',
COLUMN3 = ' || MY_CURSOR.COLUMN3);
END LOOP;
END;
【讨论】:
你救了我的命,兄弟!干杯!【参考方案3】:执行此操作的最快和最肮脏的方法实际上是通过 SQL*Plus:
SQL> set lines 200
SQL> set heading off
SQL> set feedback off
SQL> spool $HOME/your_table.out
SQL> select * from your_table;
SQL> spool off
SQL*Plus 有一些简洁的基本报告功能;我们甚至可以generate html files。
如果您有一张很长的表格(很多行)或一张很宽的表格(很多列),最好直接输出到一个文件,像这样。
declare
fh utl_file.file_type;
begin
fh := utl_file.fopen('TARGET_DIRECTORY', 'your_table.lst', 'W');
for lrec in ( select * from your_table )
loop
utl_file.put( fh, id );
utl_file.put( fh, '::' );
utl_file.put( fh, col_1 );
utl_file.put( fh, '::' );
utl_file.put( fh, col_2 );
utl_file.put( fh, '::' );
utl_file.put( fh, to_char ( col_3, 'dd-mm-yyyy hh24:mi:ss' ) );
utl_file.new_line(fh);
end loop;
utl_file.fclose(fh);
end;
/
这可能看起来很麻烦,但是可以从 USER_TAB_COLUMNS 生成 PUT() 调用。 UTL_FILE 有几个陷阱,所以read the documentation。
您可以使用与 DBMS_OUTPUT 相同的控制结构....
begin
for lrec in ( select * from your_table )
loop
dbms_output.put( id );
dbms_output.put( '::' );
dbms_output.put( col_1 );
dbms_output.put( '::' );
dbms_output.put( col_2 );
dbms_output.put( '::' );
dbms_output.put( to_char ( col_3, 'dd-mm-yyyy hh24:mi:ss' ) );
dbms_output.new_line;
end loop;
end;
/
...但是如果您要从 SQL*Plus 中脱机,为什么不使用更简单的选项呢?
【讨论】:
以上是关于如何使用pl sql中的匿名块打印出整个表?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 PL/SQL 过程和表名作为变量打印动态 SQL 中的所有表行?