这是需要执行的代码块:
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_DATE(''12.08.2013'', ''DD.MM.sYYYY'')
它时,执行成功。
这是我的问题:
1)为什么在我使用单引号时会引发异常?
2)单引号和双引号“单引号”有什么区别?
3)如果我始终使用双“单引号”,会不会有任何后果?
从Oracle文档中获取文本文字:
在语法的顶部分支中:
- c 是用户字符集的任何成员。文字中的单引号(’)必须在前面加上转义字符。要在文字中表示一个单引号,请输入两个单引号。
在您的原始版本中,紧接在之前的单引号12.08.2013
被视为该字符串的结尾-
如何知道以其他方式对其进行处理?在12.08
随后成为了许多,但它不是一个有用的地方,所以解析器不知道怎么用它做什么,所以你得到一个错误。
在第二个版本中,您转义了实际文本值中包含引号的内容,因此Oracle知道它们是文本的一部分,而不是标记文本的结尾。当它到达分号前的唯一单引号它认为 是
为字符串,结束这就是你想要的。
就像@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'))) ]';
这使得带引号的文字文字更易于阅读,并且您不必担心捕获和转义其中的所有单引号。您只需要确保选择的引号定界符没有出现在文本中即可。显示的内容将与转义引用的版本完全相同。
问题内容: 我正在尝试学习编写查询的最佳方法。我也了解保持一致的重要性。到现在为止,我在没有任何实际考虑的情况下随机使用单引号,双引号和反引号。 例: 另外,在上述例子中,考虑到,,等可以是变量。 这是什么标准?你是做什么? 我已经在这里阅读了大约20分钟的类似问题的答案,但是似乎没有确切的答案。 问题答案: 反引号用于表和列标识符,但是仅当标识符是MySQL保留关键字时,或者当标识符包含空格字符
问题内容: 这实际上有什么区别? 这工作正常: 但以下操作无效: 这是为什么? 问题答案: 那是因为双引号被认为是标准的,而单引号却没有。这并不是真正针对JQuery,而是关于JSON标准。因此,无论使用JS工具包,您都应该期待相同的行为。 值可以是带双引号的字符串,也可以是数字,也可以是true或false或null,或者是对象或数组。这些结构可以嵌套。
问题内容: SQL中的单引号和双引号有什么区别? 问题答案: 单引号用于指示SQL中字符串的开头和结尾。在SQL中通常不使用双引号,但每个数据库的双引号可能会有所不同。 坚持使用单引号。 无论如何,这是主要用途。您可以为列别名使用单引号- 您希望在应用程序代码中引用的列名可以是数据库中实际未调用的列名。例如:的可读性更高,因此您可以使用以下两种方式之一: 两者都可以在Oracle,SQL Serv
问题内容: 我有一个正在编写的脚本,用于将某些字段移至新的数据库,例如 但是如您所见,由于单引号和双引号,查询每次都会中断,是否有解决此问题的方法,例如herdok或类似的东西 问题答案: 为此而制作的。 PHP:mysql_real_escape_string
我正在使用opencsv读取csv文件。有时csv文件中包含单引号或双引号。如何读取它们而不更改csv文件本身中的数据。 现在,如果我用两个单引号替换一个单引号,它工作正常,与双引号相同,用两个替换单个引号,它的工作原理。但我不想碰源文件。 要访问的代码如下: 这样做的结果是跳过下一行(也包含双引号),插入所有奇数行,跳过偶数行 提前谢谢