重载包函数时检查参数名
功能描述
Vastbase G100在Oracle兼容模式下,支持enable_proc_param_name_override参数。
enable_proc_param_name_override参数可以控制重载包函数时,是否对参数名进行检查。
取值范围:on、off
- 当参数值为off,重载包函数时不包括对参数名的检查。
- 当参数值为on,重载包函数时包含对参数名的检查。用户调用包函数时不指定入参名称则调用函数失败,指定入参名称则调用函数成功。
默认值:off
注意事项
本特性仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。
仅Vastbase G100 V2.2 Build 10(Patch No.7)及以后版本支持此功能。
语法格式
set enable_proc_param_name_override=on/off;
示例
前置条件:
创建并切换至兼容模式为Oracle的数据库下。
create database dbtest dbcompatibility 'A';
\c dbtest;
示例1: 在参数名相同,参数类型不同,返回类型相同的存储过程中,传入列名。
1、开启enable_proc_param_name_override参数,重载包函数时包含对参数名的检查。
set enable_proc_param_name_override=on;
2、设置guc参数behavior_compat_options。
set behavior_compat_options='';
3、创建测试表并插入数据。
create schema tpcds;
create table tpcds.t1_over(id int,name varchar2);
insert into tpcds.t1_over values(1,'abc');
4、创建参数名相同,参数类型不同,返回类型相同的包内存储过程。
create or replace package pkg2 IS
FUNCTION f2(p_in1 int,p_out in int) RETURN varchar2;
FUNCTION f2(p_in1 int,p_out in varchar2) RETURN varchar2;
end pkg2;
/
create or replace package body pkg2 IS
function f2(p_in1 int,p_out in int) RETURN varchar2
as
begin
p_in1:=p_in1*2;
return concat('000',p_in1::money);
end;
function f2(p_in1 int,p_out in varchar2) RETURN varchar2
as
begin
p_in1:=p_in1/2;
return concat('aaa',p_out);
end;
end pkg2;
/
5、查询包内存储过程,传入列名。
select pkg2.f2('20',id) from tpcds.t1_over;
select pkg2.f2('20',name) from tpcds.t1_over;
查询结果分别为:
000$40.00
aaaabc
示例2:参数名相同,参数类型不同,返回类型相同的存储过程,传入in/inout。
1、开启enable_proc_param_name_override参数,重载包函数时包含对参数名的检查。
set enable_proc_param_name_override=on;
2、设置guc参数behavior_compat_options。
set behavior_compat_options='';
3、创建带函数的包。
create or replace package pkg2 IS
FUNCTION f2(p_in1 int,p_out inout int) RETURN varchar2;
FUNCTION f2(p_in1 int,p_out in money) RETURN varchar2;
end pkg2;
/
4、创建包体。
create or replace package body pkg2 IS
function f2(p_in1 int,p_out inout int) RETURN varchar2
as
begin
p_in1:=p_in1*2;
return concat('000',p_in1::money);
end;
function f2(p_in1 int,p_out in money) RETURN varchar2
as
begin
p_in1:=p_in1/2;
return concat('aaa',p_in1::money+p_out);
end;
end pkg2;
/
5、调用包内函数。
select pkg2.f2(p_in1=>20,p_out=>2);
返回结果为:
f2
---------------------
000$40.00
(1 row)
- 用户调用包函数时,不指定函数存在差异的参数名或使用语法不规范则调用失败。
- GUC参数
behavior_compat_options='proc_outparam_override'
时,由于包内函数不允许重载out参数,则在包内创建同名且有out参数的函数时就会报错。