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
我写过程序,但它没有给我正确的输出。它只能显示一次数据。你能解释为什么它只显示一次数据,之后会出错。
答案 0 :(得分:2)
您的错误表示文本文件的第九行出现问题。它不包含您期望的数值。
显然,显而易见的解决方案是让您在文本编辑器中打开文件,看看问题是什么。我们不能为你做这件事。
可能你的提取过程注入了一些额外的字符。这可能是一个换行符,可能是一些空格,也许你的表有一个你不处理的附加列等等。
最简单的解决方案是将数据读入字符串缓冲区,然后将其转换为程序中的预期数据类型。这将为您提供可在错误处理部分中使用的内容;像这样的东西:
....
exception
when VALUE_ERROR then
dbms_output.put_line('expected numeric or date value, got '||lv_string);
raise;
您可能希望为不同的数据类型定义自己的异常。这些都在PL / SQL文档中。 Find out more.
顺便说一句,这是处理数据交换的一种非常繁琐且脆弱的方式。你真的应该试图说服你的数据提取器提供一个每行有一个完整记录的文件。然后你可以使用SQL Loader或外部表,这样更容易。