我想在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'
答案 0 :(得分:2)
引用不存在的列的查询无法生成有效的计划。
您需要选择提交的查询始终有效的方法。是动态生成/执行它们或其他方法。
但是如果您提交要解析的查询,并且它在existant表上包含一个不存在的字段,解析器会将它丢回给您。