接收日期作为参数输入时出错
Posted
技术标签:
【中文标题】接收日期作为参数输入时出错【英文标题】:Error while receiving date as parameter input 【发布时间】:2013-02-13 20:20:58 【问题描述】:插入日期以测试我正在处理的参数时出现错误。错误是:
01858. 00000 - "a non-numeric character was found where a numeric was expected"
*Cause: The input data to be converted using a date format model was
incorrect. The input data did not contain a number where a number was
required by the format model.
*Action: Fix the input data or the date format model to make sure the
elements match in number and type. Then retry the operation.
这是我的测试脚本:
set serveroutput on
declare
type tempcursor is ref cursor;
v_cur_result tempcursor;
errcode number;
errmesg varchar2(1000);
p_statusmnemonic_in acts.ct_cu_act_medrecon_pg.varchararrayplstype;
p_processtypemnemonic_in transactionprocesslog.processtypemnemonic%type;
p_primarymemberplanid_in membermedicalreconcilationhdr.primarymemberplanid%type;
p_assigneduserid_in membermedicalreconcilationhdr.assigneduserid%type;
p_accountorgid_in membermedicalreconcilationhdr.accountorgid%type;
p_reconstatusmnemonic_in membermedicalreconcilationhdr.reconciliationstatusmnemonic%type;
p_estimatedenddt_in membermedicalreconcilationhdr.estimatedenddt%type;
p_actualenddt_in membermedicalreconcilationhdr.actualenddt%type;
p_inserteddate_in membermedicalreconcilationhdr.inserteddt%type;
p_insertedby_in membermedicalreconcilationhdr.insertedby%type;
p_updateddate_in membermedicalreconcilationhdr.updateddt%type;
p_updatedby_in membermedicalreconcilationhdr.updatedby%type;
begin
p_statusmnemonic_in(1) := ('OPEN');
p_statusmnemonic_in(2) := ('SUSPENDED_PRIOR_TO_COMPARE');
ct_cu_act_medrecon_pg.sps_get_patientmedrecs_hdr
(p_statusmnemonic_in,'NO','26-JAN-14',v_cur_result, errcode, errmesg);
loop
fetch v_cur_result into p_primarymemberplanid_in,p_assigneduserid_in,p_accountorgid_in,p_reconstatusmnemonic_in,
p_estimatedenddt_in,p_actualenddt_in,p_inserteddate_in,p_insertedby_in,
p_updateddate_in,p_updatedby_in,p_processtypemnemonic_in;
dbms_output.put_line(' planid '||p_primarymemberplanid_in||' userid '||p_assigneduserid_in);
exit when v_cur_result%notfound;
end loop;
dbms_output.put_line(' error code '||errcode||' message '||errmesg);
end;
当日期设置为“24-JAN-13”时,我没有收到错误消息,但第二次我更改了任何内容,我收到了该错误消息。这是我正在查看的表中的两个估计日期字段:
24-JAN-13 04.29.19.989847000 PM
28-JAN-13 08.52.27.187015000 PM
这是我的过程:
procedure sps_get_patientmedrecs_hdr (
p_statusmnemonic_in in varchararrayplstype,
p_processtypemnemonic_in in transactionprocesslog.processtypemnemonic%type,
p_estimatedenddt_in in membermedicalreconcilationhdr.estimatedenddt%type,
p_return_cur_out out sys_refcursor,
p_err_code_out out number,
p_err_mesg_out out varchar2)
is
lv_varchararray varchararray := varchararray();
begin
if p_statusmnemonic_in.count > 0
then
for rec1 in 1..p_statusmnemonic_in.count
loop
lv_varchararray.extend(1);
lv_varchararray(rec1) := p_statusmnemonic_in(rec1);
end loop;
open p_return_cur_out for
select h.membermedreconciliationhdrskey,
h.primarymemberplanid,
h.assigneduserid,
h.accountorgid,
h.reconciliationstatusmnemonic,
h.estimatedenddt,
h.actualenddt,
h.inserteddt,
h.insertedby,
h.updateddt,
h.updatedby
from membermedicalreconcilationhdr h
where h.reconciliationstatusmnemonic in (select *
from table (cast(lv_varchararray as varchararray)))
and h.estimatedenddt <= nvl(p_estimatedenddt_in, h.estimatedenddt)
and not exists (select *
from transactionprocesslog tpl
where tpl.transactiontypemnemonic = 'MEDREC'
and tpl.transactionid = h.primarymemberplanid
and nvl(p_processtypemnemonic_in, tpl.processtypemnemonic) = tpl.processtypemnemonic);
else
open p_return_cur_out for
select h.membermedreconciliationhdrskey,
h.primarymemberplanid,
h.assigneduserid,
h.accountorgid,
h.reconciliationstatusmnemonic,
h.estimatedenddt,
h.actualenddt,
h.inserteddt,
h.insertedby,
h.updateddt,
h.updatedby
from membermedicalreconcilationhdr h;
end if;
p_err_code_out := 0;
exception
when others then
p_err_code_out := -1;
p_err_mesg_out := 'error in ct_cu_act_medrecon_pg.sps_get_patientmedrecs_hdr => ' || sqlerrm;
end sps_get_patientmedrecs_hdr;
我尝试了 to_date 函数,但收到了同样的错误。任何帮助将不胜感激,在此先感谢。
【问题讨论】:
【参考方案1】:看起来您将字符串视为日期,这取决于您的 NLS 设置可能会或可能不会起作用。每当 Oracle 看到它期望日期的字符串时,它会尝试根据该字符串是否恰好与您的特定会话的日期格式参数匹配来进行隐式日期转换。这是一个非常常见的错误来源。
要使用正确的日期,您可以像这样使用 to_date 函数:
to_date('26-JAN-14','DD-MON-RR')
或使用本机语法来指定日期文字,这是我的建议:
date'2014-1-26'
【讨论】:
我试过了,但它们已经不起作用了。我开始认为它可能不是日期,但我找不到它可能是什么。 sps_get_patientmedrecs_hdr 期望收到什么?日期、数字还是 varchar? 它应该根据需求从表中获取字段,然后传递给游标。 抱歉,我想问的是您是否可以确认 membermedicalreconcilationhdr 表中估计的enddt 列的 db 列确实是一个日期。我遇到了类似的问题,我的所有参数都是正确的,但我正在比较的 db 字段出乎意料地是 varchar2 而不是正确的日期,并且其中一行的日期字符串格式不正确。 没有问题!解读 Oracle 极其无用的错误消息总是会让人很困惑,因为它们非常有效地让你看错了地方。以上是关于接收日期作为参数输入时出错的主要内容,如果未能解决你的问题,请参考以下文章
解析参数“--change-batch”时出错:预期:“=”,接收到:“”用于输入:
E0312, C2664 尝试将矢量对象作为函数参数传递时出错