暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

openGauss/MogDB数据库package关键字的两种用法

原创 多米爸比 2022-01-13
1555

package关键字在openGauss/MogDB数据库里有两种用法:

  • package包,分为Package Specification和Package Body。
    注意:需要在Oracle兼容下(dbcompatibility=‘A’)
  • package属性,用于存储过程重载。

下面演示这两种用法。

一、package包

创建一个员工表

create table emp(
empno bigserial,               
name varchar,				 
job varchar,				 
mgr numeric,					 
hiredate timestamp without time zone,						
sal numeric,						 
comm numeric,                
deptno numeric
);

创建package包接口,用于客户端接口调用

create package employee_management as
    c_empno numeric = 9999;	
    function hire_emp (name varchar, job varchar,
                       mgr numeric, hiredate timestamp,
                       sal numeric, comm numeric,
                       deptno numeric) return numeric;		
    procedure fire_emp (emp_id numeric);			   
end employee_management;
/

创建package body包实现,可用于后端修改

create package body employee_management as
    function hire_emp (name varchar, job varchar,
	    mgr numeric, hiredate timestamp, sal numeric,
		comm numeric,  deptno numeric) 
	return numeric  as 
	declare
		new_empno numeric;
	begin
		select nextval('emp_empno_seq') into new_empno;
        insert into emp values (new_empno, name, job, 
		     mgr,hiredate, sal, comm, deptno);
		return new_empno;
	end;
	
	procedure fire_emp(emp_id in number) 
	as
    begin
        delete from emp where empno = emp_id;
    end;	
end employee_management;
/

接下来我们可以通过员工管理接口来进行调用,命令如下。

call employee_management.hire_emp('tom','teacher',1,localtimestamp,1,1,1);

image.png
通过上面示例,我们可以看到第一种用法,创建package包接口,里面可以创建不同的程序体,包括变量、函数、存储过程等。

二、package属性

PostgreSQL测试

首先我们来看PG数据库里的这个测试

create or replace procedure myproc(
in p1 varchar,
in p2 varchar, 
out p3 varchar) 
as $$
begin
    p3 = p1;
    raise notice 'procedure parameter: %', p1 ;
end ;
$$
language plpgsql;

create or replace procedure myproc(
in p1 varchar,
in p2 varchar) 
as $$
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
$$
language plpgsql;

第二个同名的myproc存储过程创建会失败,提示信息如下:

ERROR:  cannot change whether a procedure has output parameters
HINT:  Use DROP PROCEDURE myproc(character varying,character varying) first.

测试截图如下
image.png

上面的测试在MogDB数据库里也是同样的效果,不能通过输出参数来对存储过程进行重载,上面第一个myproc是有输出参数,第二个myproc没有输出参数。

openGauss/MogDB测试

接下来我们在MogDB数据库里,不使用out输出参数,但我们改变in输入参数的类型,测试重载。

create or replace procedure myproc2(
in p1 varchar,
in p2 varchar) 
as 
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
/

create or replace procedure myproc2(
in p1 integer,
in p2 integer) 
as 
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
/

最终我们的结果是只能看到最后一个两个输入参数为integer类型的myproc2,截图如下。
image.png

接下面我们对第一个输入参数为varchar类型的myproc2使用package属性进行重载(加到as关键字前面)

create or replace procedure myproc2(
in p1 varchar,
in p2 varchar) 
package as 
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
/

可以看到下面的提示:

ERROR:  Do not allow package function overload not package function.

image.png
可以看出我们不能使用后加package属性的myproc2(输入参数类型为varchar)去重载非package属性的myproc2(输入参数类型为integer)。

最后测试正确的示例:

create or replace procedure myproc3(
in p1 varchar,
in p2 varchar) 
package as 
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
/

create or replace procedure myproc3(
in p1 integer,
in p2 integer) 
package as 
begin
    raise notice 'procedure parameter: %', p1 ;
end ;
/

下面的截图可以看到符合我们的预期。
image.png

三、结论

  • openGauss/MogDB数据库里package关键字有两种用法,一种是package包,另一种package属性用于存储过程重载。
  • 函数的重载不需要使用package属性,存储过程重载需要显式使用package属性。
最后修改时间:2022-10-22 12:46:00
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论