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
与掩码一起使用:
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>
<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
与掩码一起使用:
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>