0

給与が入力番号よりも多い従業員レコードから行を取得するプロシージャを作成したいと考えています。そして、その出力をテキストファイルに取得します。どこが間違っているのかわかりません。私を助けてください。前もって感謝します。

以下の構造の従業員テーブルがあります。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): 警告: コンパイルされましたが、コンパイル エラーが発生しました

4

1 に答える 1

0

エラーが表示される行は 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);
于 2013-02-22T19:47:38.193 に答える