5

次のようなSQLクエリに遭遇しました

select "hello"
from "foo"."bar"

Oracleでは、引用符で囲まれた識別子と引用符で囲まれていない識別子を使用できることがわかりました。 データベースオブジェクト名と修飾子

...引用符で囲まれた識別子は二重引用符( ")で始まり、終了します。引用符で囲まれた識別子を使用してスキーマオブジェクトに名前を付ける場合、そのオブジェクトを参照するときは常に二重引用符を使用する必要があります。

DBAに聞いたところ、名前バーはあるが「バー」はないテーブルがあると言われました。

何故ですか?

4

4 に答える 4

9

テーブルには名前が付けられていますが、そうではbarありませんBARが、小文字であるため、二重引用符を使用して"bar"のみ参照できます。

select * from bar; -- will fail

select * from "bar"; -- will succeed

道徳は次のとおりです。このようなテーブルは絶対に作成しないでください。

于 2011-06-24T13:26:58.357 に答える
3

data_dictionary では、オブジェクト名はすべて大文字で格納されていることを知っておくと役立ちます。引用符で囲まれた識別子を使用して、オラクルに「ねえ、このオブジェクト名で大文字と小文字を区別したくない」、つまり「このリテラル名でこのテーブルを作成してください」と具体的に伝えない限り

以下 - bar という名前のテーブルを作成します。「from bar」、「from BaR」、「from BAR」を使用して選択できます。「from "bar"」は機能しません。これは、オラクルに「文字通り小文字の「bar」という名前のテーブルの結果を教えてください」と言っているからです。

「bar」という名前のテーブルを作成します。「from "bar"」を使用してのみ選択できます。これは、「from bar」が「from BAR」に変換されるためです。

SQL> create table bar (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;

no rows selected

SQL> select * from BAR;

no rows selected

SQL> select * from "bar";
select * from "bar"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "BAR";

no rows selected

SQL> 
SQL> drop table bar;

Table dropped.

SQL> 
SQL> create table "bar" (x varchar2(1));

Table created.

SQL> 
SQL> select * from bar;
select * from bar
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from BAR;
select * from BAR
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> select * from "bar";

no rows selected

SQL> select * from "BAR";
select * from "BAR"
              *
ERROR at line 1:
ORA-00942: table or view does not exist 


SQL> 
SQL> drop table "bar";

Table dropped.

SQL> spool off
于 2011-06-24T14:28:37.983 に答える
2

何かを引用することで、データベース エンティティで非照合一致を強制します。したがって、トニーの答えはほぼ正しいと思います。

select sysdate from dual; -- works

select sysdate from DUAL; -- works

select sysdate from "DUAL"; -- works

select sysdate from "dual"; - FAILS

また、引用したように、引用符で囲まれた文字列を使用してテーブルが作成された場合は、引用符で囲まれた文字列を使用して参照する必要があります。

私は Oracle で実験したことはありませんが、他の DBMS では、引用符で囲まれた識別子を使用すると、予約語を識別子として使用できます。

SELECT `SUM` FROM `WHERE`;

HTH

于 2011-06-24T14:18:36.577 に答える
2

別の、しかし同様の注意として、Oracleの二重引用符は、引用したテキストが示すように文字列定数ではなく、識別子を示します。これは、「foo」.「bar」が存在する場合でも、例でエラーが発生することを意味します。次の簡単な例を考えてみましょう。

SQL> SELECT "hello" FROM "DUAL";

SELECT "hello" FROM "DUAL"

ORA-00904: "hello": invalid identifier

これに対して:

SQL> SELECT 'hello' FROM "DUAL";

'HELLO'
-------
hello

「DUAL」は識別子です。この場合、テーブルを表します。ユーザー、列などを表すことができますが、文字列定数として解釈されません。

于 2011-06-24T14:29:22.803 に答える