如何使用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 中的所有表行?

Oracle_PL/SQL 匿名块

在 PL/SQL 中创建匿名块

PL/SQL ORA-01422 SELECT INTO 错误,Oracle 匿名块(NOVA 环境)

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?