文章目录
1.布尔类型在oracle存储过程中支持情况
(1)布尔类型在过程、函数、包中的支持情况
Oracle存储过程定义布尔类型的关键字为boolean,不存在bool或者其他的关键字。
boolean类型的值有三种:true、false和null,true表示结果为真,false表示结果为假,其中null表示未知状态(unknown)。
存储过程中的过程、函数、包均支持boolean类型的变量、常量。
过程、函数支持boolean类型的参数、默认值,函数支持boolean类型的返回值。
下面用例编译执行均正确:
创建一个过程,过程中调用fun_test函数和pack_test包中的boolean:
create or replace procedure pro_test(v_int in boolean, v_out out boolean) is
v_bool_null boolean := null;
v_bool boolean := pack_test.p_bool_true;
begin
v_out := v_int and v_bool and fun_test(v1 => v_bool);
end;
创建一个返回值和参数均为boolean的函数:
create or replace function fun_test(v_bool in boolean) return boolean is
bool1 boolean;
begin
if v_bool then
bool1 := true;
else
bool1 := false;
end if;
return bool1;
end fun_test;
创建一个含有boolean类型的包:
create or replace package pack_test is
p_bool_true constant boolean := true;
p_bool_false constant boolean := false;
end;
(2)布尔类型与其他类型的兼容情况
boolean类型不支持与int、varchar类型之间的默认转换。将1、‘true’、‘1’赋值给boolean类型的变量时,均会报“表达式类型错误”。
算数运算符两端的操作数不支持boolean类型的变量或结果为布尔类型的表达式。
逻辑运算符两端支持boolean类型操作数或者结果为boolean类型的表达式。下面测试用例编译、执行均正确。
(3)布尔类型作为cast函数参数情况
通过测试和查阅资料发现,cast函数支持的参数类型如下:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR() 、VARCHAR
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
在oracle存储过程中,cast函数的参数不支持boolean类型、boolean值、以及值为boolean类型的表达式。
(4)存储过程case-when语句对布尔类型的支持情况
oracle存储过程中case-when语句支持boolean类型变量、常量、以及产生boolean值的表达式。
(5)存储过程SQL语句对布尔类型的支持情况
oracle存储过程SQL语句中where条件表达式支持可以产生布尔值的表达式,不支持布尔类型的变量,不支持布尔类型的常量。
(6)存储过程UDF对布尔类型的支持情况
定义udf时,如果定义中有SQL语句,SQL语句不支持布尔类型的变量和常量,其余部分的使用均与(1)的支持情况相同。
调用udf时,不支持返回类型为boolean的udf,如fun_udf1;不支持参数类型为boolean的udf,如fun_udf2;也不支持将fun_udf1作为fun_udf2的参数;但是支持用返回值和参数均不是boolean的udf调用fun_udf1和fun_udf2,如fun_udf3。
(7)存储过程UDAF对布尔类型的支持情况
定义udaf时,对象的属性类型不支持boolean类型,其余部分的使用均与(1)的支持情况相同。
参数类型为boolean,返回值类型为int的udaf在SQL中的使用,因为无法传入boolean类型的参数,所以不支持。如果将返回类型为boolean的udf作为参数类型为boolean的udaf,也不支持。
参数类型为int,返回值类型为boolean的udaf,将其放到having语句后面测试,不支持。
2.调研总结
- 1)Oracle存储过程中过程、函数、包均支持boolean类型,且boolean值为null、true、false。可以定义boolean类型的变量、常量。boolean类型可以作为参数、默认值、返回值。可以用boolean类型的变量、常量代替产生boolean值的表达式,如case-when语句中。
- 2)Oracle存储过程不支持boolean类型与其他类型之间的默认转换,也不支持使用cast函数进行转换,因为cast函数的参数不支持boolean类型和boolean值。
- 3)Oracle存储过程SQL中不支持boolean类型的变量、常量。如查询语句中where条件表达式后面,不能使用boolean变量或常量与表达式进行逻辑运算。
- 4)定义udf时,如果有SQL语句,SQL不支持boolean,其余均符合存储过程对boolean的支持情况,如(1)。使用udf时,不支持直接调用返回类型或参数为boolean的udf,也不支持将返回类型为boolean的udf作为参数类型为boolean的udf的参数,但支持返回类型和参数都不是boolean的udf嵌套调用返回类型或参数为boolean的udf。
- 5)定义udaf时,对象的属性类型不支持boolean类型,其余均符合存储过程对boolean的支持情况,如(1)。不支持参数或返回值为boolean类型的udaf。