如何在pl sql中使用匿名块打印整个表?

时间:2010-02-27 17:41:56

标签: sql oracle plsql

我想使用DBMS_OUTPUT.PUT_LINE,但行数超过1.表中没有任何内容按顺序递增,因此我无法使用循环。有没有办法打印出表格中的每一行?

3 个答案:

答案 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;