0

我在https://dba.stackexchange.com/questions/3587/oracle-automate-export-unload-of-data找到了一个很好的问题。使用这样的结构是否有效:

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组件。因此,据我所知,该字段应该已经存在于查询中。我对吗?

我可以简单地从光标写一行吗?

4

1 回答 1

1

提到的答案并不完整,我认为它是作为一个示例(伪代码)给出的,它缺乏实现细节。

因为它是:

  • 您的SELECT条款无效,您没有选择任何内容。你想选择什么?
  • XX.row游标所在的构造xx不存在
  • 此外,该UTL_FILE.get_line过程接受 aVARCHAR2作为其第二个参数,而不是任何类型的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;
于 2013-02-12T13:17:20.957 回答