2012-01-10 4 views
0

私は最近、MSSQLデータベースをOracleデータベースに移行するように求められました。Oracleクライアントでは、列名のまわりにかっこが必要ですか?

私はsqlクエリを実行するために従来の方法を使用しています。

何かの理由で私にはわかりませんが、Oracleではカラム名の前後にカッコを入れる必要があります(なぜですか?) これには回避策がありますか?代わりに、VSサーバーエクスプローラで、最後の問い合わせが

SELECT "level_1", "element_id" 
FROM "tnuot_menu_tree" 
WHERE ("level_1" IN 
    (SELECT "level_1" FROM "tnuot_menu_tree" mt 
    WHERE ("element_id" IN 
     (SELECT "element_tree_id" FROM "tnuot_menu_elements" 
      WHERE (UPPER("element_link") LIKE '%DEFAULT.ASPX'))))) 
AND ("level_2" = 0) AND ("level_3" = 0) 
に「翻訳」を取得します

次のコードが原因(MSSQLの下でうまく動作するために使用される)括弧

using (var msq = new OracleConnection(sConnectionString)) 
{ 
    msq.Open(); 
    OracleCommand msc = msq.CreateCommand(); 
    msc.CommandText = @"SELECT level_1,element_id FROM tnuot_menu_tree 
         WHERE level_1 IN 
          (SELECT mt.level_1 FROM tnuot_menu_tree mt 
           WHERE mt.element_id IN 
           (SELECT element_tree_id FROM tnuot_menu_elements 
           WHERE UPPER(element_link) LIKE :url)) 
         AND level_2 = 0 AND level_3 = 0"; 

    msc.Parameters.Add("url", SqlDbType.VarChar); 
    msc.Parameters["url"].Value = "%" + sName.ToUpper(); 
    OracleDataReader mrdr = msc.ExecuteReader(); 

    while (mrdr.Read()) 
    { 
     sResult.arDirectResult.Add(mrdr[0].ToString()); 
     sResult.arDirectResult.Add(mrdr[1].ToString()); 
     break; 
    } 

    msc.Dispose(); 
    mrdr.Dispose(); 
    msq.Close(); 
} 

で失敗します

これはうまくいきます。

この厄介な作業を取り除く方法に関するアイデアはありますか?

+0

最初のコードブロックを実行すると動作しますか? –

+0

@HansKesting、nope - ORA-00942:テーブルまたはビューが存在しません。 – Shai

+3

私はテーブルが大文字と小文字を区別して作成されていると思いますので、それを照会するには引用符が必要です。 '' tnuot_menu_elements "'は大文字と小文字の区別を保証します。悲しいことに、 'CREATE TABLE"の結果tnuot_menu_elements "..' – V4Vendetta

答えて

5

おそらく、必要な括弧ではありません。それは二重引用符です。これは、OracleのSQLServerの角括弧の使用に相当します。テーブルは小文字の名前で作成されていますが、二重引用符を使用しないため、Oracleは自動的に名前を大文字に変換します。

3

最初のクエリと2番目のクエリの主な違いは、引用符(括弧ではなく)です。追加のかっこは必要ありません。彼らはVSサーバーエクスプローラの奇妙なアーティファクトであるようです。

一般的な考え方とは異なり、Oracleでは大文字と小文字が区別されます。列名はlevel_1LEVEL_1です。列名と表名がすべて大文字の場合、OracleはSQL文中の引用符で囲まれていないすべての識別子を大文字に変換するため、大文字と小文字は区別されません。

カラム名とテーブル名に小文字を使用する場合は、カラム名を二重引用符で囲んで、適切なケーシングを保持する必要があります。