如何根据Oracle数据库版本从同一个表返回不同的列? (v$版本中的横幅与banner_full)

问题描述 投票:0回答:1

如果数据库版本为 18+,我需要从 v$version 返回 BANNER_FULL 列,否则返回 BANNER 列。两者都存在于所有版本中,但横幅已被弃用。

column v_dbversion new_value v_dbversion

select to_number(substr(version,1,2)) v_dbversion
  from product_component_version
 where upper(product) like '%DATABASE%';

select case
       when &v_dbversion < 18 then
         banner
       when &v_dbversion >= 18 then
         banner_full
       end as "Database Version"
  from v$version;

V_DBVERSION
-----------
12
横幅_完整
*
第 5 行出错
ORA-00904:“BANNER_FULL”:无效标识符

如果我注释掉“when >=18 thenbanner_full”行,它适用于版本 12,反之亦然,适用于版本 19。

database oracle case sqlplus
1个回答
0
投票

您可以创建一个函数并使用条件编译:

CREATE FUNCTION db_banner
RETURN VARCHAR2 DETERMINISTIC
IS
  v_version VARCHAR2(100);
BEGIN
  SELECT $IF DBMS_DB_VERSION.VERSION < 18
         $THEN banner
         $ELSE banner_full
         $END
  INTO   v_version
  FROM   v$version
  WHERE  ROWNUM = 1;

  RETURN v_version;
END;
/

然后在 Oracle 11 中输出:

SELECT db_banner()
FROM   dual

是:

DB_BANNER()
Oracle Database 11g Express 版本 11.2.0.2.0 - 64 位生产版

Oracle 11g 小提琴

在 Oracle 18 中,输出为:

DB_BANNER()
Oracle Database 18c Express Edition 版本 18.0.0.0.0 - 生产
版本 18.4.0.0.0

Oracle 18 小提琴

© www.soinside.com 2019 - 2024. All rights reserved.