Oracle中的游标迭代

Oracle中的游标迭代,oracle,cursor,Oracle,Cursor,我发现了一个很好的问题。使用这种结构是否有效: 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; CUR

我发现了一个很好的问题。使用这种结构是否有效:

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
错误,该错误表明我应该定义
组件。因此,就我而言,此字段应该已经存在于查询中。我说得对吗


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

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

事实上:

  • 您的
    SELECT
    子句无效,您没有选择任何内容。您想选择什么
  • 结构
    XX.row
    ,其中
    XX
    是一个光标,但该结构不存在
  • 此外,该过程接受
    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;

r
已经是您的行,因此您需要执行
r.column\u name
是否应将其写入
r.column\u name%type
?如果我不想指定所有列名,该怎么办。。我的查询中有许多列?否,需要精确的列名(还需要
*
选择中的列)