我想使用DBMS_OUTPUT.PUT_LINE
,但行数超过1.表中没有任何内容按顺序递增,因此我无法使用循环。有没有办法打印出表格中的每一行?
答案 0 :(得分:13)
尝试这样的事情。
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;
/
答案 1 :(得分:2)
实现这一目标的快速而最脏的方法实际上是通过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;
/
这可能看起来像一件苦差事,但PUT()调用可以从USER_TAB_COLUMNS生成。 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中删除,为什么不使用更简单的选项呢?
答案 2 :(得分:0)
这可能有所帮助:
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;