3

で下位互換性のあるクエリを作成したいと考えていますSYS.ALL_ARGUMENTS。Oracle 11g では、便利なALL_ARGUMENTS.DEFAULTED列が追加されました。Oracle 10g に対してこのクエリを実行すると、次のようになります。

SELECT defaulted FROM all_arguments

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

ORA-00904: "SYS"."ALL_ARGUMENTS"."DEFAULTED": 識別子が無効です

私がやりたいことはこれです:

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に頼らずに、単一のSQLクエリでそれを行う方法はありますか? または、最初に次のように Oracle のバージョンを確認する必要があります。

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

1 に答える 1

3

存在しない列を参照するクエリは、有効なプランを生成できません。

送信されたクエリが常に有効であるアプローチを選択する必要があります。それらを動的に生成/実行するか、その他のアプローチをとります。

ただし、解析対象のクエリを送信し、そのクエリに存在するテーブルに存在しないフィールドが含まれている場合、パーサーはそれを返します。

于 2012-04-20T09:24:12.977 に答える