0

友人私は以下に示すUTLコードを使用してnewempテーブルにデータをアップロードするコードを書いていましたが、エラーが発生しました

  1  declare
  2       EMPNO     NUMBER(4);
  3       ENAME      VARCHAR2(10);
  4       JOB       VARCHAR2(10);
  5       MGR       NUMBER(4);
  6       HIREDATE  DATE;
  7       SAL       NUMBER(7,2);
  8       COMM      NUMBER(7,2);
  9       DEPTNO    NUMBER(2);
 10       line varchar2(100);
 11       namesfile UTL_FILE.FILE_TYPE;
 12      begin
 13       namesfile :=UTL_FILE.FOPEN('DIPRJDIR','empdata.txt','R');
 14       loop
 15       UTL_FILE.GET_LINE(namesfile,EMPNO,4);
 16       dbms_output.put_line('EMPNO :' || EMPNO);
 17       UTL_FILE.GET_LINE(namesfile,ENAME,10);
 18       dbms_output.put_line('ENAME :' || ENAME);
 19       UTL_FILE.GET_LINE(namesfile,JOB,9);
 20       dbms_output.put_line('JOB :' || JOB);
 21       UTL_FILE.GET_LINE(namesfile,MGR,4);
 22       dbms_output.put_line('MGR :' || MGR);
 23       UTL_FILE.GET_LINE(namesfile,HIREDATE,5);
 24       dbms_output.put_line('HIREDATE :' || HIREDATE);
 25       UTL_FILE.GET_LINE(namesfile,SAL,9);
 26       dbms_output.put_line('SAL :' || SAL);
 27       UTL_FILE.GET_LINE(namesfile,COMM,9);
 28       dbms_output.put_line('COMM :' || COMM);
 29       UTL_FILE.GET_LINE(namesfile,DEPTNO,2);
 30       dbms_output.put_line('DEPTNO :' || DEPTNO);
 31       insert into newemp values(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO);
 32       end loop;
 33       utl_file.fclose(namesfile);
 34*      end;
SQL> /
EMPNO :7839
ENAME :KING
JOB :PRESIDENT
MGR :0

ERROR

declare
*
ERROR at line 1:
ORA-01843: not a valid month
ORA-06512: at line 23

そして、私のデータは以下の特定の形式です 7839KING PRESIDENT 000017-nov-1981 005000.00 000000.0010 だから助けてください

4

1 に答える 1

2

これは、UTL_FILE.GET_LINEプロシージャーが VARCHAR2 を 2 番目のパラメーターとして取得するためです。

varchar2 oracle 以外のものを入れると、それを暗黙的に正しい型にキャストしようとします。
これは数値では非常にうまく機能しましたが、日付データ型では、オラクルはNLS_DATE_FORMATファイル内の文字列の形式に合わない可能性のある を使用します。

UTL_FILE.GET_LINE呼び出しでVARCHAR2 を使用して修正し、to_date関数を使用して日付データ型に変換できます。

ただし、このジョブを実行するためのより良い方法があります。外部テーブル
を 使用してファイルを読み取り、そこから読み取ることができます。insert-select

于 2012-05-30T07:35:49.567 に答える