在Oracle中迭代游标

时间:2013-02-12 12:59:53

标签: oracle cursor

我在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组件。所以,就我而言,这个字段应该已经存在于查询中。我是对的吗?

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

1 个答案:

答案 0 :(得分: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;