如何处理Oracle数据格式错误?

时间:2015-06-22 17:47:30

标签: oracle syntax-error toad

我有一个带有以下标题的程序:

CREATE OR REPLACE PROCEDURE ABC.PRC_MYPROC
    (
       P_Cursor      OUT SYS_REFCURSOR,
       P_Year        DATE,
       P_Unit        CLOB,
       P_Location    CLOB, 
       P_Vp          CLOB,
       P_Director    CLOB, 
       P_Manager     CLOB
   )

我想测试此过程以确保它返回正确的结果。

我在TOAD中编写以下代码来测试程序:

VARIABLE io_cursor refcursor;
Execute ABC.PRC_MYPROC(:io_cursor, TO_DATE('2015'), 'TTV_ARC_UMF', 'Olympia', 'Mark Brant', 'Jane Lowe', 'Stanley Drake');
print io_cursor;

当我执行代码时,会弹出一个TOAD窗口,要求我设置io_cursor的值。我将类型设置为CURSOR,方向和值显示为灰色。

当我单击“确定”时,出现以下错误:

ORA-01861: literal does not match format string
ORA-06512: at line 1

有谁知道我能做什么?

1 个答案:

答案 0 :(得分:3)

这是您如何调用该过程的问题,而不是过程本身。

您使用单个参数调用TO_DATE(),因此您提供的文字将使用您的会话的NLS_DATE_FORMAT转换为日期。据推测,这不只是' YYYY'。

SELECT TO_DATE('2015') FROM DUAL;

Error report -
SQL Error: ORA-01861: literal does not match format string

通过明确提供更长格式的模型,您可以看到同样的事情,例如:

SELECT TO_DATE('2015', 'DD/MM/YYYY') FROM DUAL;

Error report -
SQL Error: ORA-01861: literal does not match format string

无论如何,你不应该依赖NLS设置,但是对于临时测试,它可以。但由于您的设置与您传递的值不匹配,因此您需要指定它:

SELECT TO_DATE('2015', 'YYYY') FROM DUAL;

TO_DATE('2015','YYYY')
----------------------
2015-06-01 00:00:00   

如您所见,如果您只提供当月的日期默认为当月的第一天as mentioned in the documentation

  

如果指定没有时间组件的日期值,则默认时间为午夜(分别为24小时和12小时时间的00:00:00或12:00:00)。如果指定的日期值没有日期,则默认日期是当月的第一天。

目前还不清楚你打算如何处理传递的价值,但是如果你认为它是一年中的第一个,你需要提供更全面的,或者更长的文字和格式模型,或更简单地使用日期文字:

SELECT DATE '2015-01-01' FROM DUAL;

DATE'2015-01-01'  
-------------------
2015-01-01 00:00:00

或者,如果您希望将该值作为当前年份的基础,则可以将其截断:

SELECT TRUNC(SYSDATE, 'YYYY') FROM DUAL;

TRUNC(SYSDATE,'YYYY')
---------------------
2015-01-01 00:00:00