2010-02-27 14 views

回答

10

试试这样的事情。

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; 
     /
+0

我怎么能递增到光标移动到下一行? – n0ob 2010-02-27 17:53:28

+4

你不需要 - 像上面这样的隐式游标会自动获取下一行,并在没有更多行要获取时退出。 – 2010-02-27 23:48:33

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; 
/

这可能看起来像一件杂事,但可以从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 *后台走出另外,为什么不使用更容易的选择?

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;