如何在 Oracle 中转义保留字?

Posted

技术标签:

【中文标题】如何在 Oracle 中转义保留字?【英文标题】:How do I escape a reserved word in Oracle? 【发布时间】:2010-11-12 20:09:11 【问题描述】:

在 TSQL 中,我可以使用 Select [table] from tablename 之类的东西来选择名为“table”的列。

如何为 oracle 中的保留字执行此操作?

编辑:我尝试过方括号、双引号、单引号和反引号,它们不起作用...

作为进一步的澄清,我有一个名为评论的专栏。由于这是一个保留字,oracle 正在尝试使用它进行选择,因此在解析查询时失败。我试过从表名中选择“评论”,但没有奏效。我会检查一下情况,然后回来。

【问题讨论】:

Oracle: What exactly do quotation marks around the table name do?的可能重复 【参考方案1】:

通过快速搜索,Oracle 似乎使用双引号(",例如"table"显然需要正确的大小写——而对于任何感兴趣的人来说,mysql 默认使用反引号 ( `) 除非设置为使用双引号以实现兼容性。

【讨论】:

我标记了你,因为我试图用双引号转义这个词,但它不起作用。 默认情况下,Oracle 将大写任何标识符。因此,如果您需要小写字符或特殊字符,或者标识符是 Oracle 保留字,则需要将其括在双引号中。由于双引号保留大小写,因此标识符也需要是正确的大小写。 我使用 SQL Developer v4 创建了一个带有“别名”字段的表,该表访问了 Oracle 11g 第 2 版 Express 数据库。当我写“别名”而不是别名时,我的选择起作用了。 不适用于触发器,请尝试为名称违反 ORA-30507(例如 DATABASE)的表创建触发器。 用大写的“TABLE”试试。【参考方案2】:

Oracle 通常需要双引号来分隔 SQL 语句中的标识符名称,例如

SELECT "MyColumn" AS "MyColAlias"
FROM "MyTable" "Alias"
WHERE "ThisCol" = 'That Value';

但是,它允许省略双引号,在这种情况下,它会悄悄地将标识符转换为大写:

SELECT MyColumn AS MyColAlias
FROM MyTable Alias
WHERE ThisCol = 'That Value';

在内部转换为:

SELECT "ALIAS" . "MYCOLUMN" AS "MYCOLALIAS"
FROM "THEUSER" . "MYTABLE" "ALIAS"
WHERE "ALIAS" . "THISCOL" = 'That Value';

【讨论】:

【参考方案3】:

当我将关键字作为列名之一时,双引号在 oracle 中起作用。

例如:

select t."size" from table t 

【讨论】:

Oracle DB 很可能将列名大写,并且在引用时,列标识符区分大小写!【参考方案4】:

Oracle 确实使用双引号,但您很可能需要将对象名称大写,例如“桌子”。默认情况下,如果您创建一个不带双引号的对象,例如

CREATE TABLE table AS ...

Oracle 会将对象创建为大写。但是,除非您使用双引号,否则引用不区分大小写!

【讨论】:

【参考方案5】:

您必须将该列重命名为其他名称,因为 TABLE 已被 Oracle 保留。

在oracle视图V$RESERVED_WORDS中可以看到Oracle的所有保留字。

【讨论】:

当我尝试 select * from V$RESERVED_WORDS 时,我得到了 ORA-00942 作者已经说过他们不能重命名或删除表列。你只需要像其他帖子中所说的那样使用双引号“table”。

以上是关于如何在 Oracle 中转义保留字?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle基础之保留字和关键字

[20170728]oracle保留字.txt

oracle保留字

建表时使用的Oracle 保留字,(因为已经使用无法更改),插入数据时提示ORA-01747?

Spring Boot/JPA:引用的保留字列名不起作用

从正则表达式中转义完整路径的一部分,同时保留其中的一部分