VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

重载包函数时检查参数名

功能描述

Vastbase G100在Oracle兼容模式下,支持enable_proc_param_name_override参数。

enable_proc_param_name_override参数可以控制重载包函数时,是否对参数名进行检查。

取值范围:on、off

  • 当参数值为off,重载包函数时不包括对参数名的检查。
  • 当参数值为on,重载包函数时包含对参数名的检查。用户调用包函数时不指定入参名称则调用函数失败,指定入参名称则调用函数成功。

默认值:off

注意事项

本特性仅在数据库兼容模式为Oracle时能够使用(即创建DB时DBCOMPATIBILITY='A'),在其他数据库兼容模式下不能使用该特性。

语法格式

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参数的函数时就会报错。