首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ROWTYPE和FETCH命令错误

ROWTYPE和FETCH命令错误
EN

Stack Overflow用户
提问于 2011-03-17 18:25:19
回答 2查看 491关注 0票数 0
代码语言:javascript
复制
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语句相关的错误,您能建议我在代码中可以做哪些更改……

EN

回答 2

Stack Overflow用户

发布于 2011-03-17 21:29:14

你需要告诉我们你得到了哪些错误,因为从你的来源来看,可能有很多错误。

例如,您的游标最多可选择10行。但是,您没有执行循环,因此如果PERSON表中有多行,则fetch将抛出TOO_MANY_ROWS。

此外,您还需要显式引用游标的各个元素,而不是%ROWTYPE变量。

此外,查询的投影必须与提取到的变量(列数、列的数据类型等)相匹配。将游标用于语法更容易,让Oracle为我们处理它。这也解决了TOO_MANY_ROWS问题。

所以我会重写你的代码,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-03-17 19:20:49

我的猜测是,表包含的列超过了您选择的3列,因此尝试将这3列提取到一个结构包括表中所有列的记录中将会失败。将记录定义更改为:

代码语言:javascript
复制
V_PERSON test_persondetails%rowtype;

并移动到光标定义后的to。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5337766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档