Oracle 使用UTL#U文件在NEWEMP表中插入数据,但它';它只能显示一个数据

Oracle 使用UTL#U文件在NEWEMP表中插入数据,但它';它只能显示一个数据,oracle,stored-procedures,plsql,utl-file,Oracle,Stored Procedures,Plsql,Utl File,我已经写了这个程序,但它没有给我正确的输出。它只能显示一次数据。您能向我解释一下为什么它只显示一次数据,然后就会出现错误。您的错误意味着文本文件的第九行有问题。它不包含您期望的数值 显然,显而易见的解决方案是在文本编辑器中打开文件,看看问题出在哪里。我们不能为你做这件事 可能您的提取过程已经注入了一些额外的字符。这可能是换行符,也可能是一些空格,或者您的表中有一个未处理的附加列,等等 最简单的解决方案是将数据读入字符串缓冲区,然后在程序中将其转换为预期的数据类型。这将为您提供一些可以在错误处理部

我已经写了这个程序,但它没有给我正确的输出。它只能显示一次数据。您能向我解释一下为什么它只显示一次数据,然后就会出现错误。

您的错误意味着文本文件的第九行有问题。它不包含您期望的数值

显然,显而易见的解决方案是在文本编辑器中打开文件,看看问题出在哪里。我们不能为你做这件事

可能您的提取过程已经注入了一些额外的字符。这可能是换行符,也可能是一些空格,或者您的表中有一个未处理的附加列,等等

最简单的解决方案是将数据读入字符串缓冲区,然后在程序中将其转换为预期的数据类型。这将为您提供一些可以在错误处理部分使用的内容;大概是这样的:

 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
您可能希望为单独的数据类型定义自己的异常。这些都在PL/SQL文档中



顺便说一句,这是一种处理数据交换的非常费力和脆弱的方法。您确实应该尝试说服您的数据提取器提供一个每行都有完整记录的文件。然后,您可以使用SQL加载器或外部表,这要简单得多。

正如前面的问题:使用
varchar2
,当我将empno的数据类型更改为varchar 2而不是更改为时,不要依赖隐式类型转换HII。我没有获得正确的输出。我可以使用sqlloader和外部表上载数据。但是我想学习一些新的东西,我尝试使用utl,我得到了答案,我刚刚添加了“utl_FILE.get_line(namesfile,l_fileline)”,最后非常感谢
    .... 
exception
     when VALUE_ERROR then
         dbms_output.put_line('expected numeric or date value, got '||lv_string);
         raise;