2012-04-20 7 views
2

SYS.ALL_ARGUMENTSに下位互換性のある問合せを作成したいとします。 Oracle 11gでは、有用なALL_ARGUMENTS.DEFAULTED列が追加されました。私は、Oracle 10gのに対して、このクエリ実行する場合:今Oracleディクショナリ・ビューに存在しない可能性のある列を選択してください

SELECT defaulted FROM all_arguments 

を私はもちろん、エラーが発生します。

ORA-00904: "SYS" "ALL_ARGUMENTS" "債務不履行":。。

SELECT CASE WHEN column_exists("defaulted") 
      THEN defaulted 
      ELSE 'N' 
     END 
FROM all_arguments 

あるいはさらに良い:無効な識別子が

私は何をしたいのはこれです

SELECT evaluate_column_on_current_row(column_name   => "defaulted", 
             default_if_not_exists => 'N') 
FROM all_arguments 

PL/SQLを使用せずに、1つのSQLクエリでこれを行う方法はありますか?それとも私はこのような最初のOracleのバージョンを確認する必要があります

SELECT count(*) 
FROM all_tab_cols 
WHERE owner = 'SYS' 
AND table_name = 'ALL_ARGUMENTS' 
AND column_name = 'DEFAULTED' 
+0

どのようなエラーが表示されますか? – Arion

+0

@Arion:ORA-00904 ...更新された質問を参照してください。 –

答えて

2

有効なプランを生成することができない存在しない列を参照する照会。

送信されたクエリが常に有効な方法を選択する必要があります。それらを動的に生成/実行する、またはその他の方法でもかまいません。

しかし、解析対象のクエリをサブミットし、既存のテーブルに存在しないフィールドが含まれている場合、パーサーはそれを戻します。

+0

はい、私は投射の現在の行が与えられた場合に式を評価するシステム機能があると考えました。 明らかに、これは実行計画の生成には最適ではありませんが、なぜこれが原則的に可能であるべきではないかはわかりません...完全な動的列名評価 –

+0

@ LukasEder - SQLがコンパイルされているため、簡単です。インダイレクションのレベルが必要な場合、実行時にフィールド名がルックアップされる場合、ソリューション*は*動的SQLです。これには多くの理由があります。最も簡単なのは、クエリが解析されてコンパイルされるように提出されたときに、さまざまな統計情報やその他の詳細がチェックされ(インデックス、制約、選択性など)、プランが作成されます。そのプランは、*その*クエリに対して固定されます。わずかに異なるクエリを送信すると、新しい計画が作成されます。これは、SQLが動作する方法です。あなたの最初の例では、動的SQLは私にとって完全に適しているようです。 – MatBailie

関連する問題