如果数据库版本为 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。
您可以创建一个函数并使用条件编译:
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 18 中,输出为:
DB_BANNER() |
---|
Oracle Database 18c Express Edition 版本 18.0.0.0.0 - 生产 版本 18.4.0.0.0 |