选择Oracle字典视图中可能不存在的列

时间:2012-04-20 09:17:51

标签: sql oracle compatibility information-schema

我想在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

有没有办法在单个SQL查询中执行此操作,而无需求助于PL / SQL?或者我应该首先检查Oracle版本:

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

1 个答案:

答案 0 :(得分:2)

引用不存在的列的查询无法生成有效的计划。

您需要选择提交的查询始终有效的方法。是动态生成/执行它们或其他方法。

但是如果您提交要解析的查询,并且它在existant表上包含一个不存在的字段,解析器会将它丢回给您。