我想从 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;
我已经尝试过:
SELECT dbms_utility.is_cluster_database FROM DUAL;
失败并显示消息“ORA-06553: PLS-382: 表达式类型错误”SELECT CAST(dbms_utility.is_cluster_database AS INT) FROM DUAL;
失败并显示相同消息SELECT sys.diutil.bool_to_int(dbms_utility.is_cluster_database) from DUAL;
失败并显示相同消息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;
我猜不可能在 SQL 中读取布尔值,但你可以编写一个包装函数来分析该布尔值并返回 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;
当然,结果是number类型。
is_cluster_database
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(单实例)。