在语句中读取 Oracle 布尔值 dbms_utility.is_cluster_database

Reading Oracle boolean filed dbms_utility.is_cluster_database in statement

我想从 Oracle 数据库 (11g) 读取 boolean 字段,但我无法这样做,可能是因为 Oracle 不完全支持布尔数据格式。

我感兴趣的领域是 dbms_utility.is_cluster_database

工作说明:

set serveroutput on;
BEGIN
  IF dbms_utility.is_cluster_database THEN
      dbms_output.put_line('true');
  ELSE
      dbms_output.put_line('false');
  END IF;
END;

这条语句工作正常,但是我需要它作为 SQL 查询,例如 SELECT 'someValue' from dual;

我试过了:

  1. SELECT dbms_utility.is_cluster_database FROM DUAL; 失败并显示消息 "ORA-06553: PLS-382: expression is of wrong type"
  2. SELECT CAST(dbms_utility.is_cluster_database AS INT) FROM DUAL; 失败并显示相同的消息
  3. SELECT sys.diutil.bool_to_int(dbms_utility.is_cluster_database) from DUAL; 失败并显示相同的消息
  4. SELECT CASE WHEN (dbms_utility.is_cluster_database) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN FROM DUAL; 失败并显示消息 "SQL Error: ORA-00920: invalid relational operator"

我不知道如何修复它。

问题绝对与数据库访问权限无关(因为 "dbms_output" 解决方案有效)。此外,可以使用简单的 SELECT dbms_utility.<something> from dual; 读取 dbms_utility 中的其他字段,例如。 SELECT dbms_utility.get_endianness FROM DUAL;

我想不可能读取 SQL 中的布尔值,但您可以编写一个包装函数来分析该布尔值和 return varchar2/int/number.

或者,在您的特定情况下,您可以这样做:

select value from v$parameter where name='cluster_database';

按照@MaxU 的建议,您可以创建包装函数。

create or replace function is_cluster_database return number is
begin
  return sys.diutil.bool_to_int(dbms_utility.is_cluster_database);
end is_cluster_database;

然后就这样用了

select is_cluster_database from dual;

当然,结果是数字类型。

is_cluster_database

0