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 作为第二个参数。

如果您放置 varchar2 以外的其他内容,oracle 会尝试将其隐式转换为正确的类型。
这对您使用数字非常有效,但是对于 Date 数据类型,oracle 将使用NLS_DATE_FORMAT可能不符合文件中字符串格式的 。

您可以通过在调用中使用 VARCHAR2 来修复它,UTL_FILE.GET_LINE然后使用to_date函数将其转换为日期数据类型。

But, there is a better way to do this job-
You can use an external table to read the file and then insert-select from it.

于 2012-05-30T07:35:49.567 回答