ОШИБКА КОМАНДЫ ROTTYPE И FETCH - PullRequest
0 голосов
/ 17 марта 2011
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;

Я получаю некоторые ошибки, связанные с оператором выборки. Не могли бы вы предложить мне изменения, которые могут быть выполнены этим кодом ......

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вы должны сообщить нам , какие ошибки вы получаете , поскольку, глядя на ваш источник, их потенциально много.

Например, ваш курсор выберет до десяти строк.Однако вы не выполняете цикл, поэтому ваша выборка будет отбрасывать TOO_MANY_ROWS, если в таблице PERSON более одной строки.

Кроме того, вам необходимо явно ссылаться на отдельные элементы курсора, а не на переменную% 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;

Открытие и закрытие файла для каждой строки не является неправильным, только медленнее, чем нужно.

0 голосов
/ 17 марта 2011

Я предполагаю, что таблица содержит более 3 столбцов, которые вы выбираете, и поэтому попытка извлечь эти 3 столбца в запись, структура которой включает все столбцы таблицы, будет неудачной. Измените определение записи на:

V_PERSON test_persondetails%rowtype;

и перейдите к после определения курсора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...