2013-02-12 77 views
0

我在https://dba.stackexchange.com/questions/3587/oracle-automate-export-unload-of-data找到了一個好問題。它是有效使用這樣的結構:在Oracle中迭代通過遊標

FOR r IN (SELECT * FROM table) LOOP 
    UTL_FILE.PUT_LINE(lfFilelog, r.row); 
END LOOP; 

我試圖用這樣的:

CREATE OR REPLACE PROCEDURE p_name(DESTFOLDER in varchar2, FILENAME in varchar2) 
IS 
    V_FILEHANDLE UTL_FILE.FILE_TYPE; 
    CURSOR dataset IS 
     SELECT 
      field1, 
      field2, 
      fieldN 
     FROM 
      table1, 
      table2, 
      (SELECT field3 from table3); 
     -- WHERE CLAUSE ... and so on.. 
BEGIN 
    V_FILEHANDLE := UTL_FILE.FOPEN(DESTFOLDER, FILENAME, 'w'); 
    FOR R IN dataset LOOP 
     UTL_FILE.PUT_LINE(V_FILEHANDLE, R.ROW); 
    END LOOP; 
END; 
/

並獲得pls-00302錯誤,指出我應該定義ROW組件。所以就我而言,這個字段應該已經存在於查詢中。我對嗎?

我可以簡單地從光標寫一行嗎?

+0

'r'已經是你的行,所以你需要做的'r.column_name' – 2013-02-12 13:06:25

+0

它應該被寫作'r.column_name%類型'?另外如果我不想指定所有列名稱,我的查詢中有很多列? – lexeme 2013-02-12 13:09:20

+0

不需要,確切的列名稱(也需要'*'或'select'中的列) – 2013-02-12 13:17:28

回答

1

答案提到的不完整,我認爲它是作爲一個例子(僞代碼),缺乏實施細節。

因爲它是:

  • SELECT條款是無效的,你沒有任何選擇。你想選擇什麼?
  • 構建XX.row其中xx是光標不存在
  • 此外,UTL_FILE.get_line過程接受VARCHAR2作爲第二個參數,而不是任何種rowtype
  • 不能命名錶table(儘管你可以命名它"table")。

給定一個表mytable(col1, col2, ... , colN)你可以寫:

CREATE OR REPLACE PROCEDURE p_name() 
IS 
    V_FILEHANDLE UTL_FILE.FILE_TYPE; 
    CURSOR dataset IS SELECT col1, col2, /*...*/ coln FROM mytable; 
BEGIN 
    /*utl_file.fopen maybe?*/ 
    FOR R IN dataset LOOP 
     UTL_FILE.PUT_LINE(V_FILEHANDLE, R.col1 ||';'|| r.col2 /*...*/ || r.coln); 
    END LOOP; 
END;