当前位置: 首页 > 知识库问答 >
问题:

oracle给定PL/SQL:数字或值错误:字符对数字错误

佟阳云
2023-03-14

我的桌子是:

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 developer中运行时,我收到以下错误:

ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误ORA-06512:在“系统读取文件”的第36行ORA-06512:在第2行

但当我直接输入值(通过使用插入查询)f_empno,f_hiredate,f_salary...

有人能告诉我为什么我会犯上述错误吗。

提前谢谢。

编辑:按照要求,CSV文件中的第一行显示为:

1,Akon,TSP,Navi,01-10-2002,2000

共有2个答案

湛财
2023-03-14

谢谢大家的回复。

我已经变了

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

问题是包含列名而不是数据的第一行。

慕项明
2023-03-14

似乎日期格式是错误的。

f_hiredate := to_date(substr(f_line, comma4 + 1, comma5 - comma4 - 1), 'dd-mon,-yyyy');

正确的格式是dd-mm-yyyy

P. s.
有更好的方法来做到这一点。
如果你可以访问服务器外部表,那就太好了。
从客户端,SQL*Loader。
如果你坚持程序-正则表达式会很好地为你服务...

 类似资料:
  • 有没有办法在mybatis结果映射中指定一个字符串最多应包含20个字符?或者如何设置精度,如数字(4,2)? 例如,我有一个如下所示的结果图: 我可以将int的位数限制为只有1,在浮点数上的“.”后面显示N个元素,或者将字符串大小限制为一定的数字吗? 我正在处理的视图具有以下列结构: 编辑1:每当我试图调用存储过程在此视图中添加新项时...我会得到这个错误: 我创建了一个用于测试的类,该类尝试调用

  • 在函数中,我在这一行上有ORA-06502错误: 我看这里没有任何转换问题/完全困惑/

  • 我试图插入一个记录到oracle数据库使用一个过程。记录已插入,但出现异常。 将上述代码调用为: 以上代码调用以下过程; 执行语句时发生错误 组织。springframework。jdbc。BadSqlGrammarException:CallableStatementCallback;错误的SQL语法[{调用MYPROCEDURE(?,,,,,,,,,,,,,,,,,?)}];嵌套的异常是jav

  • 我在下面的字段上得到字符串缓冲区太小的错误。 位于导致错误的select语句中。它是数据类型。

  • 下面是表上web方法适配器的错误,该适配器具有MIH_触发器。 (65000/6502)ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误ORA-06512:在“B2B_OPS_BUILD_ADMIN.MIH_TRIGGER”第2行ORA-04088:执行触发器“B2B_OPS_BUILD_ADMIN”时出错。米尤触发器' 下面是MIH_TRIGGER引用,每当更新OFFSET列时

  • 我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。 错误: 通过将变量“a”的声明方式更改为: *注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。