Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中,如何为用户+表名组合使用带引号的标识符?_Sql_Oracle_Reserved Words_Quoted Identifier - Fatal编程技术网

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

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

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

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

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之间进行选择?