UTL_FILE с%ROWTYPE .. ОШИБКА

Я хочу создать процедуру, которая получает строки из записей сотрудников, чья зарплата больше, чем количество ввода. И затем получить этот вывод в текстовый файл. Я не понимаю, где я делаю неправильно. Пожалуйста, помогите мне. Заранее спасибо.

У меня есть таблица сотрудников, которая структурирована ниже. Сотрудники Desc TABLE; Имя Нуль? Тип


EMPLOYEE_ID NOT NULL NUMBER (6)
FIRST_NAME VARCHAR2 (20)
LAST_NAME NOT NULL VARCHAR2 (25)
EMAIL NOT NULL VARCHAR2 (25)
PHONE_NUMBER VARCHAR2 (20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2 (10)
Заработная плата (8,2)
COMMISSION_PCT NUMBER (2,2)
MANAGER_ID NUMBER (6)
DEPARTMENT_ID NUMBER (4)

и когда я хочу запустить скрипт ниже.

    CREATE OR REPLACE PROCEDURE P_TEST3 ( P_SAL NUMBER) IS

    TYPE EMP_TEMP IS TABLE OF employees%ROWTYPE;
   V_EMP_ROW     EMP_TEMP ;


 V1 utl_file.file_type;

 E1 utl_file.file_type;

    BEGIN


 V1 := utl_file.fopen('ABC','VALID.txt','W');
E1 := utl_file.fopen('ABC','ERROR.txt','W');

SELECT *  BULK COLLECT INTO V_EMP_ROW   FROM Employees  WHERE salary > p_sal   ;

FOR i IN  V_EMP_ROW.FIRST .. V_EMP_ROW.LAST 
    LOOP
    UTL_FILE.PUT_LINE (V1, V_EMP_ROW(I).EMPLOYEE_ID ||',' || V_EMP_ROW(I).FIRST_NAME ||','|| V_EMP_ROW(I).SALARY );
    END LOOP;

  dbms_output.put_line ('Total row inserted '||sql%rowcount || '.  Please see valid.txt file ' );


EXCEPTION

WHEN OTHERS THEN
raise_application_error( -20002,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);

utl_file.put_line (E1,SQLCODE || '---' || SQLERRM);

DBMS_OUTPUT.PUT_LINE ('PLEASE SEE Error.txt FILE');

utl_file.fclose(v1);
utl_file.fclose(E1);

 END P_TEST3;

/

А компилятор выдаст ниже ошибку. [Предупреждение] ORA-24344: успех с ошибкой компиляции 21/42 PLS-00302: должен быть объявлен компонент "EMPLOYEE_ID" 21/9 PL/SQL: оператор игнорируется (1: 0): предупреждение: скомпилировано, но с ошибками компиляции

1 ответ

Строка с сообщением об ошибке - 21, которая выглядит так:

UTL_FILE.PUT_LINE (V1, V_EMP_ROW(I).EMPLOYEE_ID ||',' || V_EMP_ROW(I).FIRST_NAME ||','|| V_EMP_ROW(I).SALARY );

Я хотел бы предположить, что проблема заключается в том, что в вашем операторе BULK SELECT не возвращаются строки или они не в том формате, который вы ожидаете.

Попробуйте вставить что-то вроде:

dbms_output.put_line('Record is: '|| V_EMPROW(i));

как первая строка в вашем цикле.

Или, может быть, сделать подсчет результатов массового выбора до цикла:

dbms_output.put_line('Record count is: '|| V_EMPROW.COUNT);
Другие вопросы по тегам