【问题标题】:ibatis, oracle: escaping inside BEGIN/END blockibatis,oracle:在 BEGIN/END 块内转义
【发布时间】:2015-09-09 23:56:00
【问题描述】:
<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

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

【问题讨论】:

  • 为什么不把birthday列转换成sqlDATE做你的操作呢?
  • 因为这不是一个选项。我正在向已经部署的其他人的代码添加一个功能。
  • 你从来没有说过你的约束。您希望我们如何知道您的选择是什么?说真的,你在这个网站上得到了免费帮助,然后你开始变得粗鲁......希望你能找到答案。
  • @Luiggi:?我在 OP 中说明了约束..
  • 你刚才说不能改变数据和字段的类型。但我想说的是,使用REPLACE 将那些. 替换为-,然后使用TO_DATEbirthday 列转换为sql DATE。我从来没有说过改变列的类型,我说过 convert,

标签: sql oracle date-comparison


【解决方案1】:

使用带有掩码的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;

【讨论】:

  • @eugene 请说明什么适合你。
【解决方案2】:

生日字段是 varchar 而不是日期

生日 = 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2023-02-09
    • 2016-04-10
    相关资源
    最近更新 更多