如何在 Oracle 中为用户 + 表名组合使用带引号的标识符?

Posted

技术标签:

【中文标题】如何在 Oracle 中为用户 + 表名组合使用带引号的标识符?【英文标题】:How do I use quoted identifier for user + table name combination in Oracle? 【发布时间】:2015-08-10 14:57:21 【问题描述】:

在我的 Oracle DB 设置中,所有表都是在专用用户帐户 SYS0MYUSER 下创建的。在我的系统上执行以下查询时,我得到了SQL Error: ORA-00903: invalid table name

SELECT COUNT(*) FROM SYS0MYUSER.USER;

我试图像这样转义保留关键字:

SELECT COUNT(*) FROM "SYS0MYUSER.USER";

然后我又遇到了一个错误SQL Error: ORA-00942: table or view does not exist

用户名+保留关键字组合的正确转义方式是什么?

更新: 表别名是怎么回事,我也必须使用双引号吗?

【问题讨论】:

找出实际的架构名称。 SYS0MYUSER 是实际的架构名称吗? @Rahul OP 提到用户是SYS0MYUSER。在 Oracle 中,用户名和模式名是同义词。 @tommyk - 表名是USER @LalitKumarB 是的,表名是 USER。 @tommyk 查看我的答案,已更新以回答您关于表别名的问题。 【参考方案1】:

如果您使用 quoted identifier 创建了表格,那么在引用对象的任何地方都必须始终使用 双引号

来自文档,

数据库对象命名规则

每个数据库对象都有一个名称。在 SQL 语句中,您表示 带有带引号的标识符或不带引号的对象的名称 标识符。

带引号的标识符以双引号 (") 开头和结尾。如果您使用带引号的标识符命名架构对象,那么您 引用该对象时必须使用双引号。

未加引号的标识符没有被任何标点符号包围。

例如,

SQL> CREATE TABLE "USER"(A NUMBER);

Table created.

SQL>
SQL> SELECT COUNT(*) FROM LALIT.USER;
SELECT COUNT(*) FROM LALIT.USER
                           *
ERROR at line 1:
ORA-00903: invalid table name


SQL>
SQL> SELECT COUNT(*) FROM LALIT."USER";

  COUNT(*)
----------
         0

SQL>

因此,您需要将表格作为引用标识符

SELECT COUNT(*) FROM SYS0MYUSER."USER";

更新 OP 更新了他关于表别名的问题。

关于表别名我也必须使用双引号吗?

表别名与引用的标识符无关。

例如,

SQL> SELECT t.* FROM LALIT."USER" t;

no rows selected

SQL>

【讨论】:

【参考方案2】:
SELECT COUNT(*) FROM "SYS0MYUSER"."USER";

【讨论】:

你怎么知道SYS0MYUSER是架构名? 架构名称不需要带引号的标识符。 引用标识符永远不会出错,即使它们不是保留字。我想说总是双引号所有标识符实际上是一个好习惯,主要是因为可移植性和前向兼容性。 (不过我有点懒,所以不常做……) 总是双引号所有标识符实际上是一个好习惯我不同意这一点。这会给开发人员带来更多的困惑。假设开发人员养成了使用带引号的标识符的习惯,然后他在带引号的标识符中使用了小写的对象名称,他将得到错误ORA-00942: table or view does not exist。使用quoted-identifier,问题在于它区分大小写 如果你从 TABLEA 中选择 *,Oracle 如何在 TableA 和 TABlea 之间进行选择?

以上是关于如何在 Oracle 中为用户 + 表名组合使用带引号的标识符?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 动态 sql 使用带括号的参数作为表名

如何在 Oracle 中为所有用户和权限生成 DDL

如何在休眠中为@ElementCollection 设置表名

如何在 Metro 应用程序中为组合框添加颜色?

如何快捷地查询Oracle中每个用户表的表名和行数?

在 Python 中为 Oracle 选择查询绑定变量