我在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
组件。所以,就我而言,这个字段应该已经存在于查询中。我是对的吗?
我可以简单地从光标写一行吗?
答案 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;