0
 declare
     ENAME      VARCHAR2(10);
      JOB       VARCHAR2(10);
     MGR       VARCHAR2(4);
     HIREDATE  varchar2(11);
     SAL       VARCHAR2(11);
      COMM      VARCHAR2(9);
     DEPTNO    number(2);
        EMPNO     NUMBER(4);
           namesfile UTL_FILE.FILE_TYPE;
  begin
      namesfile :=UTL_FILE.FOPEN('DIPRJDIR','empdata.txt','R');
      LOOP
          EMPNO:=0;
          ENAME :=0;
          JOB:=0;
          MGR:=0;
          HIREDATE:=0;
          SAL:=0;
          COMM :=0;
          DEPTNO:=0;
          UTL_FILE.GET_LINE(namesfile,EMPNO,4);
          dbms_output.put_line('EMPNO :' || EMPNO);
          UTL_FILE.GET_LINE(namesfile,ENAME,10);
          dbms_output.put_line('ENAME :' || ENAME);
          UTL_FILE.GET_LINE(namesfile,JOB,9);
          dbms_output.put_line('JOB :' || JOB);
          UTL_FILE.GET_LINE(namesfile,MGR,4);
          dbms_output.put_line('MGR :' || MGR);
          UTL_FILE.GET_LINE(namesfile,HIREDATE,11);
          dbms_output.put_line('HIREDATE :' || HIREDATE);
           UTL_FILE.GET_LINE(namesfile,SAL,11);
           dbms_output.put_line('SAL :' || SAL);
           UTL_FILE.GET_LINE(namesfile,COMM,9);
           dbms_output.put_line('COMM :' || COMM);
           UTL_FILE.GET_LINE(namesfile,DEPTNO,2);
           dbms_output.put_line('DEPTNO :' || DEPTNO);
       END LOOP;
    END;


    In the loop it display data only one time after than it give error

   SQL> /
    EMPNO :7839
    ENAME :KING
    JOB :PRESIDENT
    MGR :0000
    HIREDATE :17-nov-1981
    SAL : 005000.00
    COMM :000000.00
    DEPTNO :10
    declare


    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 22

プログラムを作成しましたが、適切な出力が得られません。一度だけデータを表示することができます。データが1回だけ表示され、その後エラーが発生する理由を説明していただけますか。

4

1 に答える 1

2

エラーは、テキスト ファイルの 9 行目に問題があることを意味します。期待する数値が含まれていません。

明らかな解決策は、ファイルをテキスト エディターで開き、問題の原因を確認することです。私たちはあなたのためにこれを行うことはできません.

おそらく、抽出プロセスで余分な文字が挿入された可能性があります。これは改行文字である可能性があり、いくつかのスペースである可能性があり、テーブルに処理していない追加の列がある可能性があります。

最も簡単な解決策は、データを文字列バッファに読み込んでから、プログラム内で期待されるデータ型に変換することです。これにより、エラー処理セクションで使用できるものが得られます。このようなもの:

    .... 
exception
     when VALUE_ERROR then
         dbms_output.put_line('expected numeric or date value, got '||lv_string);
         raise;

個別のデータ型に対して独自の例外を定義したい場合があります。それはすべてPL/SQLのドキュメントにあります。 詳細をご覧ください。


ちなみに、これはデータ交換を処理するための非常に骨の折れる脆弱な方法です。データ エクストラクタに、1 行に 1 つのレコード全体を含むファイルを提供するように説得する必要があります。次に、はるかに簡単な SQL ローダーまたは外部テーブルを使用できます。

于 2012-05-30T09:41:55.787 に答える