Sql 在Oracle中,如何为用户+表名组合使用带引号的标识符?
在我的Oracle DB设置中,所有表都是在专用用户帐户SYS0MYUSER下创建的。在我的系统上执行以下查询时,我得到了SQL错误:ORA-00903:表名无效 我试图像这样转义保留关键字:Sql 在Oracle中,如何为用户+表名组合使用带引号的标识符?,sql,oracle,reserved-words,quoted-identifier,Sql,Oracle,Reserved Words,Quoted Identifier,在我的Oracle DB设置中,所有表都是在专用用户帐户SYS0MYUSER下创建的。在我的系统上执行以下查询时,我得到了SQL错误:ORA-00903:表名无效 我试图像这样转义保留关键字: SELECT COUNT(*) FROM "SYS0MYUSER.USER"; 但是我得到了另一个错误SQL错误:ORA-00942:表或视图不存在 什么是转义用户名+保留关键字组合的正确方法 更新: 关于表别名,我也必须使用双引号吗?如果您使用创建表,则必须始终在引用对象的任何位置使用双引号 SELE
SELECT COUNT(*) FROM "SYS0MYUSER.USER";
但是我得到了另一个错误SQL错误:ORA-00942:表或视图不存在
什么是转义用户名+保留关键字组合的正确方法
更新:
关于表别名,我也必须使用双引号吗?如果您使用创建表,则必须始终在引用对象的任何位置使用双引号
SELECT COUNT(*) FROM "SYS0MYUSER"."USER";
根据文件
数据库对象命名规则
每个数据库对象都有一个名称。在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>
SQL> SELECT t.* FROM LALIT."USER" t;
no rows selected
SQL>
因此,您需要将该表作为带引号的标识符引用:
更新OP更新了他关于表别名的问题
关于表别名,我也必须使用双引号吗
SELECT COUNT(*) FROM "SYS0MYUSER"."USER";
表别名与引用的标识符无关
比如说,
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>
SQL> SELECT t.* FROM LALIT."USER" t;
no rows selected
SQL>
找出实际的架构名称。SYS0MYUSER是实际的架构名称吗?@Rahul OP提到用户是SYS0MYUSER。在Oracle中,user和schema name是同义的。@tommyk-是表名user吗?@LalitKumarB是的,表名是user。@tommyk查看我的答案,更新后回答了您关于表别名的问题。您如何知道SYS0MYUSER是架构名?架构名不需要带引号的标识符。带引号的标识符永远不会错,即使它们不是保留词。我要说的是,实际上最好总是对所有标识符进行双引号引用,主要是因为可移植性和前向兼容性。但我有点懒,所以我不总是这样做…实际上,总是双重引用所有标识符是一种很好的做法,我不同意这一点。这会给开发者带来更多的困惑。假设开发人员养成了使用带引号的标识符的习惯,然后在带引号的标识符中使用小写的对象名,他将得到错误ORA-00942:表或视图不存在。使用带引号的标识符时,问题在于它区分大小写。如果从TableA中选择*,Oracle如何在TableA和TableA之间进行选择?