PL/SQL 存储过程错误

Posted

技术标签:

【中文标题】PL/SQL 存储过程错误【英文标题】:PL/SQL stored procedure error 【发布时间】:2016-05-05 20:53:06 【问题描述】:

这是我用 PL/SQL 编写的代码,我正在尝试从 csv 文件中读取数据并插入到 Oracle 数据库中的表中。

通常当我插入时间戳值时,我会执行以下操作

insert into t (start_time) values 
(TO_TIMESTAMP('12-SEP-12 10.31.19','DD-MON-YY HH.MI.SS'))

现在我得到了错误,来自病房的这些行,如下所示

f_call_start:=to_timestamp(substr(l_line,comma2+1,comma3-comma2-1),'DD-MON-YY HH.MI.SS'); 错误(38,28):PLS-00306:调用“SUBSTR”时参数的数量或类型错误

call_record_processor('calldata');

create or replace procedure call_record_processor(file_name_input in varchar2)
is
l_file UTL_FILE.file_type;
l_line varchar2(100);
l_eof boolean:=false;
comma1 varchar2(10);
comma2 varchar2(10);
comma3 varchar2(10);
comma4 varchar2(10);

f_source_no call_usage.source_phone_number%type;
f_dest_no call_usage.destination_phone_number%type;
f_call_start call_usage.call_start_time%type;
f_call_end call_usage.call_end_time%type;

begin
l_file:=UTL_FILE.fopen('c:\temp\',file_name_input,'r');

loop
  begin
  utl_file.get_line(l_file,l_line);
  dbms_output.put_line(l_line);
  EXCEPTION
  when no_data_found then
   exit;
  end;
comma1:=INSTR(l_line,',',1,1);
comma2:=INSTR(l_line,',',1,2);
comma3:=INSTR(l_line,',',1,3);
comma4:=INSTR(l_line,',',1,4);

f_source_no:=SUBSTR(l_line,1,comma1-1);
dbms_output.put_line('source_phone_number='||f_source_no);

f_dest_no:=SUBSTR(l_line,comma1+1,comma2-comma1-1);
dbms_output.put_line('destination_phone_number='||f_dest_no);

f_call_start:=to_timestamp(substr(l_line,comma2+1,comma3=comma2-1),'DD-MON-YY HH.MI.SS');
dbms_output.put_line('call_start_time='||f_call_start);

f_call_end:=to_timestamp(substr(l_line,comma3+1,comma4-comma3-1),'DD-MON-YY HH.MI.SS');
dbms_output.put_line('call_end_time='||f_call_end);

insert into call_usage values(f_source_no,f_dest_no,f_call_start,f_call_end);
end loop;
utl_file.fclose(l_file);
COMMIT;
end call_record_processor;

【问题讨论】:

您在PUT_LINE 中缺少下划线。好吧,现在您正在动态更改问题。在过去,我们常说 RTFM!语法错误!花一点时间查找 substr 的参数。 是的,我意识到我犯了一个非常愚蠢的错误,但我现在收到以下错误 Error(38,28): PLS-00306: wrong number or types of arguments in call to 'SUBSTR' from病房这条线 f_call_start:=to_timestamp(substr(l_line,comma2+1,comma3=comma2-1),'DD-MON-YY HH.MI.SS'); 是的,如果仍然需要,您只需要查看自己并提出更具体的问题。此外,如果您指的是行号,请在发布前添加它们。我怀疑有人会计算行数。无论如何,不​​是在星期四的 17:00。 :-/ 提示因为我是个好人:不属于你的等号。 【参考方案1】:

应该是dbms_output.put_line

【讨论】:

是的,我意识到现在非常愚蠢的错误,但我现在收到以下错误 Error(38,28): PLS-00306: wrong number or types of arguments in call to 'SUBSTR' from this病房线 f_call_start:=to_timestamp(substr(l_line,comma2+1,comma3=comma2-1),'DD-MON-YY HH.MI.SS'); 你能打印出什么是 substr(l_line,comma2+1,comma3=comma2-1) 吗?那会更容易调试。我猜字符串格式很可能不适合 ''DD-MON-YY HH.MI.SS''。

以上是关于PL/SQL 存储过程错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复存储过程 Oracle PL/SQL 的错误?

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

在咨询3列信息时,ORACLE PL / SQL错误与存储过程有关

执行存储过程 - Oracle PL SQL

在触发器 PL/SQL 中调用存储过程