2011-12-25 9 views
11

単純なテーブルを考えてみましょうproductsオラクル(私はOracle 9iを試してみました)。私はこのテーブルを次のCREATE文で作成しています。OracleでCREATEコマンドを使用して二重引用符内の列名を囲むことは正しく機能しません。どうして?

CREATE TABLE products 

("prod_id" varchar2(7) primary key, "product_name" varchar2(30) NOT NULL); 

それはない通常我々がそうであるように、私は二重引用符""内の列名を囲んだことに特別に注意すべきです。明らかに機能し、productsテーブルは、指定されたCONSTRAINTSを持つ2つのカラムで作成されます。


次に、次のINSERT INTOコマンドを使用してこのテーブルにいくつかの行を挿入します。

INSERT INTO products VALUES('P0001', 'Nokia-N97'); 
INSERT INTO products VALUES('P0002', 'Nokia-1208'); 
INSERT INTO products VALUES('P0003', 'Nokia-1115'); 

productsテーブルに3つの行を挿入しますか。


これらの行が実際に挿入されているかどうかを確認するために、次のようにSELECT文を発行できます。

SELECT * FROM products; 

私たちが挿入した3行をうまく表示できますか。


ここでは実際の質問です。次のSELECTステートメントを発行するとき、このSQLで間違いがないのに、

SELECT prod_id, product_name FROM products; 

が動作しません。 Oracleでは、そのような列は存在しないと報告します。なぜこれが起こるのですか?その背後には非常に特殊な理由があるに違いないと私は思う。

私はちょうど行ったように、二重引用符で不必要に列名を囲むことはベストプラクティスではないかもしれないことを確信しているが、ただの質問は私に起こりました。共通に対する

答えて

19

Oracleは、列名とテーブル名で大文字と小文字が区別され、信じています。デフォルトではすべてを大文字に変換します。

ただし、二重引用符で名前を使用する場合は、指定したとおりのスペルで列を作成するようにOracleに指示します(CREATE文の小文字)。

SELECTステートメントでは、引用符を使用しないため、名前は大文字に変換されるため、CREATEステートメントの小文字名と等しくはありません。

だから、これは動作するはずです:

SELECT "prod_id", "product_name" FROM products; 

あなたが列または表の名前が指定されている方法がわからない場合は、データ・ディクショナリにそれを見ることができます。それが引用されていなかったので、あなたは、あなたのproductテーブルの下ケースのカラム名が、大文字のテーブル名を検索します。

関連する問題