ibatis、oracle:在 BEGIN/END 块内转义

ibatis, oracle: escaping inside BEGIN/END block

<select id="foo" parameberClass="fooClass">
    {call
        declare
        dsc varchar(512);
        begin
    select
        count(*)
    into dsc
    from foo
    where birthday = TO_DATE(#birthday#, 'YYYY-MM-DD');
        end
        }
</select>

生日看起来像“1999.11.11”,我无法更改它,是的,生日字段是 varchar 而不是日期,我也无法更改它..

由于 #birthday 字符串中的 .,我收到错误消息。

ORA-06550: line 1, column 140:
PL/SQL: ORA-00911: invalid character
ORA-06550: line 1, column 48:
PL/SQL: SQL Statement ignored

我尝试了很多不同的方法来防止错误,但找不到解决方案。

TO_CHAR与掩码一起使用:

SqlFiddle

CREATE TABLE tab(d VARCHAR(100));

INSERT INTO tab(d)
VALUES (TO_CHAR(CURRENT_DATE,'YYYY.MM.DD'));

/* or not sure exactly what you want */
INSERT INTO tab(d)
VALUES (TO_CHAR(TO_DATE('2015.09.10','YYYY.MM.DD'), 'YYYY-MM-DD'))

SELECT *
FROM tab;

birthday field is varchar not date

birthday = TO_DATE(#birthday#, 'YYYY-MM-DD');

这是错误的,您正在比较字符串和日期。 birthday 列是 VARCHAR2 数据类型,并且您正在将它与 TO_DATE 进行比较,后者将字符串转换为日期。

要么两边都用TO_DATE,要么根本不用。

例如,

SQL> WITH t(birthday) AS
  2    ( SELECT '1999.11.11' FROM dual
  3    )
  4  SELECT COUNT(*)
  5  FROM t
  6  WHERE TO_DATE(birthday, 'YYYY.MM.DD') = TO_DATE('1999.11.11', 'YYYY.MM.DD');

  COUNT(*)
----------
         1

SQL>