gpt4 book ai didi

sql - 在 PL/SQL block 中使用单引号和双引号 'single quote'

转载 作者:行者123 更新时间:2023-12-02 21:54:01 30 4
gpt4 key购买 nike

这是需要执行的代码块:

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;

该 block 由java代码组成。执行时,会抛出异常org.springframework.jdbc.BadSqlGrammarException。但是当我将 TO_DATE('12.08.2013', 'DD.MM.sYYYY') 更改为 TO_DATE(''12.08.2013'', ''DD.MM.sYYYY'' ) 执行成功。

这是我的问题:

1)为什么当我使用单引号时它会抛出异常?

2)单引号和双“单引号”有什么区别?

3)如果我总是使用双“单引号”,会有什么后果吗?

最佳答案

来自 text literals 的 Oracle 文档:

In the top branch of the syntax:

  • c is any member of the user's character set. A single quotation mark (') within the literal must be preceded by an escape character. To represent one single quotation mark within a literal, enter two single quotation marks.

在您的原始版本中,紧邻 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'))) ]';

这使得引用的文本文字更易于阅读,并且您不必担心捕获和转义其中的所有单引号。您只需确保选择文本中未出现的引号分隔符即可。显示的内容将与您的转义引用版本完全相同。

关于sql - 在 PL/SQL block 中使用单引号和双引号 'single quote',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18096740/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com