ROWTYPE和FETCH命令错误

时间:2011-03-17 10:25:19

标签: oracle plsql

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语句相关的错误,请你告诉我代码可以做的更改......

2 个答案:

答案 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;

并移动到光标定义之后。