我的表是:
EmpNo Ename Job MGR HireDate Sal
1 ABC DPS JOO 01-10-2002 2000
2 BCD LPS KOL 03-11-2005 2300
3 KOLD MPS BOR 13-03-2012 2400
我正在尝试将上面的表从csv文件导入到oracle数据库中的预定义表中。下面是要在表格上导入的代码(pl sql代码)。
代码:
Drop table emp_tbl
create table emp_tbl
( EmpNo Number,
EName varchar2(15),
Job Varchar2(15),
MGR Varchar2(30),
HireDate Date,
Sal Number
);
create or replace procedure read_file_proc
Is
f_line varchar2(2000);
f utl_file.file_type ;
f_dir varchar2(250);
fname varchar2(50);
comma1 Number;
comma2 Number;
comma3 Number;
comma4 Number;
comma5 Number;
f_empno emp_tbl.empno%type;
f_ename emp_tbl.ename%type;
f_job emp_tbl.job%type;
f_mgr emp_tbl.MGR%type;
f_hiredate emp_tbl.hiredate%type;
f_sal emp_tbl.sal%type;
Begin
dbms_output.put_line('At Begin');
fname := 'Emp_tbl.csv';
f := utl_file.fopen('UTL_FILE_DIR', fname, 'R');
dbms_output.put_line('Before loop');
loop
Begin
Utl_file.get_line(f, f_line);
--dbms_output.put_line(f_line);
exception
when no_data_found then
exit;
end;
comma1 := instr(f_line,',', 1, 1);
comma2 := instr(f_line,',', 1, 2);
comma3 := instr(f_line,',', 1, 3);
comma4 := instr(f_line,',', 1, 4);
comma5 := instr(f_line,',', 1, 5);
f_empno := to_number(substr(f_line, 1, comma1 -1 ));
f_ename := substr(f_line, comma1 + 1, comma2 - comma1 - 1);
f_job := substr(f_line, comma2 + 1, comma3 - comma2 - 1);
f_mgr := substr(f_line, comma3 + 1, comma4 - comma3 - 1);
f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy');
f_sal := to_number(substr(f_line, comma5 + 1));
insert into emp_tbl values(f_empno, f_ename, f_job, f_mgr, f_hiredate, f_sal);
end loop;
utl_file.fclose(f);
--commit;
end read_file_proc;
但是在sql开发人员中运行时,我收到以下错误:
ORA-06502:PL / SQL:数字或值错误:字符到数字 转换错误ORA-06512:在“SYSTEM.READ_FILE_PROC”,第36行 ORA-06512:第2行
但是当我为f_empno,f_hiredate,f_salary直接输入值(通过使用插入查询)时,它工作正常。
任何人都可以告诉我为什么我得到上述错误。
提前致谢。
编辑:根据要求,CSV文件中的第一行显示为:
1,Akon,TSP,Navi,01-10-2002,2000
答案 0 :(得分:1)
似乎日期格式错误。
f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy');
正确的格式为dd-mm-yyyy
P.S。
有更好的方法来做到这一点
如果你有权访问服务器外部表会很棒。
从客户端,SQL * Loader
如果你坚持使用程序 - 正则表达式将很好地为你服务。
答案 1 :(得分:-1)
感谢所有人的回复。
我已经改变了
f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy');
到
f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mm-yyyy');
实际上我的csv文件是:
EmpNo,Ename,Job,MGR,HireDate,Sal
1,Akon,TSP,Navi,01-10-2002,2000
2,Anu,SSP,Man,03-11-2005,2300
问题是第一行包含列名而不是数据。