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

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

我想从 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: 表达式类型错误”
  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 错误:ORA-00920:无效的关系运算符”

我不知道如何解决它。

问题绝对与数据库访问权限无关(因为“dbms_output”解决方案有效)。此外,可以使用简单的

dbms_utility
读取
SELECT dbms_utility.<something> from dual;
中的其他字段,例如。
SELECT dbms_utility.get_endianness FROM DUAL;

oracle plsql oracle11g sql-function
3个回答
2
投票

我猜不可能在 SQL 中读取布尔值,但你可以编写一个包装函数来分析该布尔值并返回 varchar2/int/number。

或者,根据您的具体情况,您可以这样做:

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

2
投票

按照@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;

当然,结果是number类型。

is_cluster_database

0

0
投票

从 Oracle 12c 开始,也可以使用扩展的

with
子句来解决这个问题,该子句允许在声明部分定义 PL/SQL 函数:

with
function is_cluster_database return number
is
begin
  if dbms_utility.is_cluster_database then
    return 1;
  end if;
  return 0;
end;
select is_cluster_database from dual;

使用

sys.diutil.bool_to_int
将数据类型
boolean
转换为
number
的替代版本:

with
function is_cluster_database return number
is
begin
  return sys.diutil.bool_to_int(dbms_utility.is_cluster_database);
end;
select is_cluster_database from dual;

这两个语句在集群数据库 (RAC) 的情况下返回 1,否则返回 0(单实例)。

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