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语句相关的错误,请你告诉我代码可以做的更改......
答案 0 :(得分:1)
您需要告诉我们您获得了哪些错误,因为查看您的来源可能有很多错误。
例如,光标最多可选择十行。但是,您没有执行循环,因此如果PERSON表中有多行,则您的提取将抛出TOO_MANY_ROWS。
此外,您需要显式引用游标的各个元素而不是%ROWTYPE变量。
此外,查询的投影必须与您获取的变量匹配(列数,列的数据类型等)。使用CURSOR FOR语法更容易,让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;
打开和关闭每行的文件没有错,只是比需要的慢。
答案 1 :(得分:0)
我的猜测是该表包含多于您选择的3列,因此尝试将这3列提取到记录中,其结构包括表的所有列都将失败。将记录定义更改为:
V_PERSON test_persondetails%rowtype;
并移动到光标定义之后。