运行查询之前的Oracle版本检查

时间:2018-07-17 12:01:48

标签: oracle oracle11g oracle12c

我提供了可在12c上运行并具有JSON相关操作的功能。 但是当数据库为11g时,应跳过JSON查询。为此需要条件,但是这应该考虑将来的方法,因为它应该能够处理下一个oracle版本。 例如12c及更高版本中支持的JSON,但不低于此版本 使用v $ version我可以比较if条件中的字符串,但它是静态的 当前的实现方式如下

SELECT substr(banner, 1, 19)banner 
into x_version 
FROM v$version 
WHERE banner LIKE 'Oracle Database 12c%';

IF x_version = 'Oracle Database 12c' THEN ...

2 个答案:

答案 0 :(得分:4)

您可以基于conditional compilation使用dbms_db_version values

declare
$if not dbms_db_version.ver_le_11_2 $then
  l_var number;  
$end
begin
$if dbms_db_version.ver_le_11_2 $then
  null;
$else
  select json_value('{x:42}', '$.x') into l_var from dual;
  dbms_output.put_line('12c+: ' || l_var);
$end
end;
/

在11gR2上,它将得到:

PL/SQL procedure successfully completed.

在12c上得到:

12c+: 42

PL/SQL procedure successfully completed.

在条件中包装仅与12c +操作相关的所有变量声明,以及仅希望在12c及更高版本中调用的任何代码。


当然,这仅适用于11gR2版或更高版本;如果您需要能够(不执行任何操作)在11gR1上运行,则将检查更改为ver_le_11。但是,即使尝试在10g或更早版本的数据库上运行,也无法识别。

如果需要处理其他早期版本,则可以直接检查版本号(如@Wernfried所示):

declare
$if dbms_db_version.version >= 12 $then
  l_var number;  
$end
begin
$if dbms_db_version.version >= 12 $then
  select json_value('{x:42}', '$.x') into l_var from dual;
  dbms_output.put_line('12c+: ' || l_var);
$else
  null;
$end
end;
/

仅需要$else null;部分,因为我的区块中没有其他内容-如果没有PLS-00103: Encountered the symbol "END" ...,我会得到{{1}}(在11g或更早的版本中)。如果还有其他无条件的代码,则没有必要,尽管将其包含进来可能仍然更加清晰。

答案 1 :(得分:2)

那呢?

DECLARE
    ver number;
BEGIN
    DBMS_OUTPUT.PUT_LINE ( 'DBMS_DB_VERSION.VERSION = ' || DBMS_DB_VERSION.VERSION );
    DBMS_OUTPUT.PUT_LINE ( 'DBMS_DB_VERSION.RELEASE = ' || DBMS_DB_VERSION.RELEASE );
    ver := (10*DBMS_DB_VERSION.VERSION + DBMS_DB_VERSION.RELEASE) / 10;
    DBMS_OUTPUT.PUT_LINE ( 'ver = ' || ver );
end;


DBMS_DB_VERSION.VERSION = 12
DBMS_DB_VERSION.RELEASE = 1
ver = 12.1

或者您可以使用

SELECT VALUE
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_RDBMS_VERSION';