Create or replace package body file as
procedure filehandler as
declare
V_PERSON PERSON%ROWTYPE;
FID UTL_FILE.FILE_TYPE;
FOLDER_NAME VARCHAR(50) := 'GID_FILE';
FILE_NAME VARCHAR(50) :='bhanu.txt';
cusor test_persondetails is
select personid, personnum,fullnm from person where rownum<=10;
begin
open test_persondetails;
FID := UTL_FILE.FOPEN (FOLDER_NAME, FILE_NAME, 'A');
fetch test_persondetails into V_person;
DBMS_OUTPUT.PUT_LINE(V_PERSON);
UTL_FILE.PUT_LINE (FID,V_PERSON);
UTL_FILE.FCLOSE (FID);
close test_persondetails;
end test_filehandler;
end test_file;我收到了一些与fetch语句相关的错误,您能建议我在代码中可以做哪些更改……
发布于 2011-03-17 21:29:14
你需要告诉我们你得到了哪些错误,因为从你的来源来看,可能有很多错误。
例如,您的游标最多可选择10行。但是,您没有执行循环,因此如果PERSON表中有多行,则fetch将抛出TOO_MANY_ROWS。
此外,您还需要显式引用游标的各个元素,而不是%ROWTYPE变量。
此外,查询的投影必须与提取到的变量(列数、列的数据类型等)相匹配。将游标用于语法更容易,让Oracle为我们处理它。这也解决了TOO_MANY_ROWS问题。
所以我会重写你的代码,如下所示:
procedure filehandler as
FID UTL_FILE.FILE_TYPE;
FOLDER_NAME VARCHAR(50) := 'GID_FILE';
FILE_NAME VARCHAR(50) :='bhanu.txt';
begin
FID := UTL_FILE.FOPEN (FOLDER_NAME, FILE_NAME, 'A');
for V_PERSON in ( select personid, personnum,fullnm
from person where rownum<=10 )
loop
DBMS_OUTPUT.PUT_LINE(V_PERSON.personid);
UTL_FILE.PUT_LINE (FID,V_PERSON.personid
||' '||V_PERSON.personnum
||' '||V_PERSON.fullnm);
end loop;
UTL_FILE.FCLOSE (FID);
end test_filehandler;为每一行打开和关闭文件没有错,只是比需要的速度慢。
发布于 2011-03-17 19:20:49
我的猜测是,表包含的列超过了您选择的3列,因此尝试将这3列提取到一个结构包括表中所有列的记录中将会失败。将记录定义更改为:
V_PERSON test_persondetails%rowtype;并移动到光标定义后的to。
https://stackoverflow.com/questions/5337766
复制相似问题