首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ORA-01861:文字不匹配格式string.while执行过程

ORA-01861:文字不匹配格式string.while执行过程
EN

Stack Overflow用户
提问于 2016-10-04 09:59:35
回答 2查看 622关注 0票数 0

我有书面程序,其日期参数定义如下:

代码语言:javascript
运行
复制
in_Spendpaidstartdt            IN     DATE,
in_Spendpaidenddt              IN     DATE,

在过程中,我将这些参数称为:

代码语言:javascript
运行
复制
AND (   in_Spendpaidstartdt IS NULL
                       OR err.Spendpaiddt >= in_Spendpaidstartdt)
                  AND (   in_Spendpaidenddt IS NULL
                       OR err.Spendpaiddt <= in_Spendpaidenddt));

然而,甲骨文给出了以下错误:

"ORA-01861:文字不匹配格式字符串“

请给我建议一下。

EN

回答 2

Stack Overflow用户

发布于 2016-10-04 11:10:48

这是假人:

代码语言:javascript
运行
复制
CREATE OR REPLACE PROCEDURE XYZ (
   in_startdt            IN     DATE,
   in_enddt              IN     DATE,
   output                        OUT SYS_REFCURSOR)
IS
   rcrdnums   VARCHAR2 (32767);
   rcrd_cnt   INT;
BEGIN
   rcrd_cnt := 500;

   SELECT RTRIM (
             XMLCAST (
                XMLAGG (XMLELEMENT (e, RCRDNUM) ORDER BY RCRDNUM) AS CLOB),
             ',')
     INTO rcrdnums
     FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM
             FROM Table_NAME ERR
                     WHERE     ROWNUM <= rcrd_cnt
                 and (   in_startdt IS NULL
                       OR to_date(err.paiddt, 'dd/mm/yyyy') >= to_date(in_startdt, 'dd/mm/yyyy'))
                  AND (   in_enddt IS NULL
                       OR to_date(err.paiddt, 'dd/mm/yyyy') <= to_date(in_enddt, 'dd/mm/yyyy')));

   IF LENGTH (rcrdnums) = 1
   THEN
      rcrdnums := NULL;
   ELSE
      rcrdnums := rcrdnums;
      --SUBSTR (rcrdnums, 1, LENGTH (rcrdnums) - 1);
   END IF;

   DBMS_OUTPUT.PUT_LINE (rcrdnums);

   OPEN outputFOR
      SELECT *
        FROM Table_NAME ERR
             INNER JOIN (    SELECT REGEXP_SUBSTR (rcrdnums,
                                                   '[^,]+',
                                                   1,
                                                   LEVEL)
                                       AS EVENT
                               FROM DUAL
                         CONNECT BY REGEXP_SUBSTR (rcrdnums,
                                                   '[^,]+',
                                                   1,
                                                   LEVEL)
                                       IS NOT NULL) EVENT_P
                ON EVENT_P.EVENT = ERR.RCRDNUM;
END;
/
票数 0
EN

Stack Overflow用户

发布于 2016-10-04 12:51:14

正如前面提到的,你的问题是两方面的。

  1. 当您在已经是日期的东西上使用to_date时--我已经提到了elsewhere on stackoverflow --您就迫使Oracle将日期转换回字符串。
  2. 在调用过程时,您(可能)没有正确地传递参数。

以下是我如何修改你的程序:

代码语言:javascript
运行
复制
CREATE OR REPLACE PROCEDURE XYZ (
   in_startdt            IN     DATE,
   in_enddt              IN     DATE,
   output                        OUT SYS_REFCURSOR)
IS
   rcrdnums   VARCHAR2 (32767);
   rcrd_cnt   INT;
BEGIN
   rcrd_cnt := 500;

   SELECT RTRIM (
             XMLCAST (
                XMLAGG (XMLELEMENT (e, RCRDNUM) ORDER BY RCRDNUM) AS CLOB),
             ',')
     INTO rcrdnums
     FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM
             FROM Table_NAME ERR
                     WHERE     ROWNUM <= rcrd_cnt
                 and (   in_startdt IS NULL
                       OR to_date(err.paiddt, 'dd/mm/yyyy') >= in_startdt) -- in_startdt is already a DATE, so no need to convert it
                  AND (   in_enddt IS NULL
                       OR to_date(err.paiddt, 'dd/mm/yyyy') <= in_enddt)); -- in_enddt is already a DATE, so no need to convert it

   IF LENGTH (rcrdnums) = 1
   THEN
      rcrdnums := NULL;
   ELSE
      rcrdnums := rcrdnums;
      --SUBSTR (rcrdnums, 1, LENGTH (rcrdnums) - 1);
   END IF;

   DBMS_OUTPUT.PUT_LINE (rcrdnums);

   OPEN output FOR
      SELECT *
        FROM Table_NAME ERR
             INNER JOIN (    SELECT REGEXP_SUBSTR (rcrdnums,
                                                   '[^,]+',
                                                   1,
                                                   LEVEL)
                                       AS EVENT
                               FROM DUAL
                         CONNECT BY REGEXP_SUBSTR (rcrdnums,
                                                   '[^,]+',
                                                   1,
                                                   LEVEL)
                                       IS NOT NULL) EVENT_P
                ON EVENT_P.EVENT = ERR.RCRDNUM;
END;
/

为了测试,我会这样称呼你的程序:

代码语言:javascript
运行
复制
declare
  v_refcur sys_refcursor;
begin
  xyz(in_startdt => to_date('01/10/2016', 'dd/mm/yyyy'),
      in_enddt => to_date('05/10/2016', 'dd/mm/yyyy'),
      output => v_refcur);
end;
/

注:在生产代码中使用"select *“是不好的做法--您应该明确指定要返回的列;这样,如果有人添加了列,您的代码不会导致某些内容中断,因为它不会传递额外的列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39849388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档