如何在 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 中为用户 + 表名组合使用带引号的标识符?的主要内容,如果未能解决你的问题,请参考以下文章