使用UTL在表中插入数据

时间:2012-05-30 06:43:51

标签: forms oracle plsql oracle10g oracle11g

朋友我已经编写了一个代码,使用下面给出的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所以请帮帮我

1 个答案:

答案 0 :(得分:2)

那是因为UTL_FILE.GET_LINE过程,将VARCHAR2作为第二个参数。

如果你输入的东西不是varchar2 oracle试图隐式地将它强制转换为正确的类型 这对你的数字很有效,但是使用Date数据类型,oracle将使用NLS_DATE_FORMAT,它可能不符合文件中字符串的格式。

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

但是,有更好的方法来完成这项工作 -
您可以使用external table来阅读该文件,然后使用insert-select