2010-02-27 18 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;