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

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

时间:2024-04-01 11:57:05浏览次数:22  
标签:p1 varchar package MogDB numeric emp openGauss procedure

MogDB/openGauss 数据库 package 关键字的两种用法
本文出处:https://www.modb.pro/db/237701

package 关键字在 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);
通过上面示例,我们可以看到第一种用法,创建 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.
测试截图如下

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

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,截图如下。

接下面我们对第一个输入参数为 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.
可以看出我们不能使用后加 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 ;
/

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

三、结论
MogDB 数据库里 package 关键字有两种用法,一种是 package 包,另一种 package 属性用于存储过程重载。函数的重载不需要使用 package 属性,存储过程重载需要显式使用 package 属性。

标签:p1,varchar,package,MogDB,numeric,emp,openGauss,procedure
From: https://www.cnblogs.com/helloopenGauss/p/18108088

相关文章

  • java(包)package(1)
    为了使类型更容易找到和使用,避免命名冲突,以及控制访问,程序员将相关类型类编排到包中。定义:包是一组提供访问保护和名称空间管理的相关类型。注意,类型指的是类、接口、枚举和注释类型。枚举和注释类型分别是特殊类型的类和接口,因此在本文中,类型通常被简单地称为类和接口。......
  • java(包)package(3)
    命名包由于世界各地的程序员都使用Java编程语言编写类和接口,因此许多程序员可能会对不同的类型使用相同的名称。当定义了一个Rectangle类时,但该类Rectangle在java.awt包定义过。但是,如果两个类位于不同的包中,编译器允许它们具有相同的名称。每个Rectangle类的完全限定名包括包......
  • MogDB/OpenGauss数据库中通过参数控制抓取慢sql
    MogDB/OpenGauss数据库中通过参数控制抓取慢sql本文出处:https://www.modb.pro/db/221556mogdb数据库中可以通过打开相应的参数抓取慢sql,该参数为log_min_duratuion_statement。log_min_duration_statement参数说明:当某条语句的持续时间大于或者等于特定的毫秒数时,log_min......
  • MogDB学习笔记之 -- 了解pagewriter线程
    MogDB学习笔记之--了解pagewriter线程本文出处:https://www.modb.pro/db/183172在前面的MogDB学习系列中,我们了解了核心的bgwriter进程,今天继续来学习另外一个主要的线程,即pagewriter;首先来看下数据库相关的参数设置:postgres=#selectname,setting,category,context......
  • openGauss每日一练(全文检索)
    openGauss每日一练(全文检索)本文出处:https://www.modb.pro/db/224179学习目标学习openGauss全文检索openGauss提供了两种数据类型用于支持全文检索。tsvector类型表示为文本搜索优化的文件格式,tsquery类型表示文本查询课后作业1.用tsvector@@tsquery和tsquery@@......
  • openGauss每日一练第四天
    openGauss每日一练第四天本文出处:https://www.modb.pro/db/193083学习地址https://www.modb.pro/course/133学习目标学习openGauss创建角色、修改角色属性、更改角色权限和删除角色角色是用来管理权限的,从数据库安全的角度考虑,可以把所有的管理和操作权限划分到不同的角......
  • openGauss每日一练第三天
    openGauss每日一练第三天本文出处:https://www.modb.pro/db/193083学习目标学习openGauss创建数据库、修改数据库属性和删除数据库课后作业1.分别创建名为tpcc1和tpcc2的数据库SQL文本:createdatabasetpcc1;createdatabasetpcc2;\lomm=#createdatabasetpcc1......
  • MogDB/openGauss 坏块测试-对启动的影响-测试笔记1
    MogDB/openGauss坏块测试-对启动的影响-测试笔记1在UPDATE操作提交后,脏块落盘前kill掉mogdb数据库,然后对UPDATE修改的坏进行以下破坏操作,仍然能够启动数据库,数据未丢失。1、用旧数据文件替换,可以启动2、修改成错误的checksum,可以启动3、数据块修改成错误的lsn,可......
  • MogDB 安装解压错误:cannot run bzip2: No such file or directory
    MogDB安装解压错误:cannotrunbzip2:Nosuchfileordirectory本文出处:https://www.modb.pro/db/403662问题症状MogDB安装时,涉及两个步骤解压,第一步解压缩tar包:[root@enmotech~]#tar-xvfMogDB-2.1.1-CentOS-x86_64.tarupgrade_sql.tar.gzMogDB-2.1.1-CentOS-64bit......
  • 编译安装openGauss 3.0.0
    编译安装openGauss3.0.0环境检查1.1检查OS版本openGauss支持的操作系统:CentOS7.6(x86架构)openEuler-20.03-LTS(aarch64架构)openEuler-20.03-LTS(x86架构)Kylin-V10(aarch64架构)[root@og3~]#cat/etc/redhat-releaseCentOSLinuxrelease7.6.1810(Core)1.2修......