这是需要执行的代码块:
DECLARE
STR CLOB;
BEGIN
STR := ' CREATE TABLE TNAME AS
SELECT ... FROM INPUT_TABLE IP
WHERE ((IP.DATE_FIELD = TO_DATE('12.08.2013', 'DD.MM.sYYYY'))) ' ;
EXECUTE IMMEDIATE (STR);
END;
该块由java代码构成。执行时,会抛出异常org.springframework.jdbc.BadSqlGrammarException。但当我改变时TO_DATE('12.08.2013', 'DD.MM.sYYYY')
to TO_DATE(''12.08.2013'', ''DD.MM.sYYYY'')
它执行成功。
这是我的问题:
1)为什么当我使用单引号时它会抛出异常?
2)单引号和双“单引号”有什么区别?
3)如果我总是使用双“单引号”,会有什么后果吗?
来自 Oracle 文档文本文字 http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements003.htm#autoId0:
在语法的顶部分支中:
-
c是用户字符集的任何成员。文字中的单引号 (') 前面必须有转义字符。
要在文字中表示一个单引号,请输入两个
单引号。
在您的原始版本中,紧接在12.08.2013
被视为该字符串的结尾 - 它怎么知道以其他方式对待它?这12.08
然后变成一个数字,但它不在有用的地方,所以解析器不知道如何处理它,所以你会得到一个错误。
在第二个版本中,您转义了作为实际文本值一部分的引号,因此 Oracle 知道它们是文本的一部分,而不是标记文本的结尾。当它到达分号之前的单独单引号时,它会看到that作为字符串的结尾,这就是你想要的。
正如@Parado所说,尝试显示转义引用的版本,您会看到它以可以直接运行的形式出现,转义的单引号本身以字符串形式出现,作为您的create
陈述。
您确实需要转义所有单引号,但您可能会发现替代引用语法更容易,如文档中的第二个分支中所述。在你的情况下,这将是:
STR := q'[ CREATE TABLE TNAME AS
SELECT ... FROM INPUT_TABLE IP
WHERE ((IP.DATE_FIELD = TO_DATE('12.08.2013', 'DD.MM.sYYYY'))) ]';
这使得引用的文本文字更易于阅读,并且您不必担心捕获和转义其中的所有单引号。您只需确保选择文本中未出现的引号分隔符即可。显示的内容将与转义引用的版本完全相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)