原文链接:www.gbase.cn/community/p...
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
在GBase8s数据库中包提供了代码封装、信息隐藏和子程序重载等功能,提高了代码的可维护性和可重用性。本文将深入探讨GBase8s数据库中包的概念、创建、使用和删除,帮助读者全面理解这一内容。
包的概念
包是一组相关过程、函数、变量、常量、类型、游标和异常等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。包像一个容器或一个命名空间,可以将各种逻辑相关的过程、函数、变量、常量、类型、游标和异常结合在一起。为开发人员编写大型复杂应用程序提供良好的组织单元。当包被定义好后,应用程序可以通过包来访问各种不同的功能单元,而不用担心过多零散的子程序导致程序代码的松散。包具有简化应用设计、提高应用性能、实现信息隐藏、子程序重载等特点。对包中涉及的过程、函数、变量、常量、类型、游标和异常等PL/SQL程序设计元素如无特殊约束说明,其用法和现状保持一致。
包的创建
包由包头和包体组成,包头中主要是包的一些定义信息,包体中则是对应的实现部分,包中的子程序和游标是需要实现部分的,如果包头中没有声明子程序或游标,则包体可以省略。在包头中定义的对象为公有对象,可以在外部调用,只在包体中定义的对象为私有对象,只能在包中使用。
创建包头语法图如下:
item_list_1为定义的对象,包括存储过程、函数、变量、常量、类型、游标和异常。
创建包体语法图如下:
包头声明的变量、常量、游标等,包体只允许初始化一次。
包头声明的游标名不允许与 PROCEDURE、FUNCTION 的例程名相同。
包的删除
可以使用drop package body pkg_name单独删除包体,或者使用drop package pkg_name删除包和包体。删除包体后,包头依然有效。
包的引用
包在首次引用时实例化并执行initialize_section部分,我们通过例子示范包的常见用法,注意需要将SQLMODE设置为'ORACLE',如果需要输出请设置SERVEROUTPUT为ON。
包中对象调用示例
以下用例创建包中包含类型、变量、常量、异常、存储过程、函数、游标。
sql
set environment sqlmode 'oracle';
set serveroutput on;
/**********************************************
*类型 type_1
*游标 cur_1
*异常 err
*函数 sub:实现两个整数减法
*过程 add_1:实现两个整数加法
* add_2:调用cur_1和add_1,实现将t1表中的两列相加,返回结果
* p_1:调用常量、变量、函数sub
* p_2:实现修改表tint的值(配合add_1使用)
**********************************************/
/********1.测试准备********/
drop table if exists tint;
create table tint(id int,val1 int,val2 int); --扩充数据
insert into tint values(1,10,1);
insert into tint values(2,20,2);
insert into tint values(3,30,3);
insert into tint values(4,40,4);
insert into tint values(5,50,5);
insert into tint values(6,60,6);
insert into tint values(7,70,7);
insert into tint values(8,80,8);
insert into tint values(9,90,9);
/********2.包的创建********/
--创建包头
create package all_object as
--1.变量、常量
v_1 int;
v_2 int;
v_3 int:=1;
c_1 constant varchar2(100):='常量测试';
--2.异常no_res
err EXCEPTION;
--3.函数sub,实现两个整数减法
function sub(a in int,b in int,c out int) return int;
--4.游标cur_1
cursor cur_1 return tint%rowtype;
--5.存储过程add_1,实现两个整数加法
procedure add_1(a in int,b in int,c out int);
--6.存储过程add_2,调用游标cur_1和存储过程add_1,实现将t1表中的两列相加,返回结果
procedure add_2(d int);
--7.存储过程p_1,调用变量、常量、异常、函数
procedure p_1;
--8.存储过程,对表中数据进行修改
procedure p_2(a int,b int,c int);
end all_object;
/
--创建包体
create package body all_object as
--4.创建游标
cursor cur_1 return tint%rowtype is select id,val1,val2 from tint;
--3.创建函数sub,实现两个整数减法
function sub(a in int,b in int,c out int) return int is
begin
if(a>b) then
c:=a-b;
else
raise err;
end if;
return 0;
exception
when err then dbms_output.put_line('a < b');
end;
--5.存储过程add_1,实现两个整数加法
procedure add_1(a in int,b in int,c out int) is
begin
c:=a+b;
end;
--6.存储过程add_2,实现两个整数加法
procedure add_2(d int) as
type type_1 is record(
v0 int,
v1 int,
v2 int
);
ty_1 type_1;
v3 int;
begin
open cur_1;
for i in 1..d loop
fetch cur_1 into ty_1;
add_1(ty_1.v1,ty_1.v2,v3);
dbms_output.put_line(i||' is:'||v3);
end loop;
close cur_1;
end;
--7.存储过程p_1,调用变量、常量、函数
procedure p_1 as
v_4 int;
begin
all_object.v_1:=100;
all_object.v_2:=20;
v_4:=sub(v_1,v_2,v_3);
dbms_output.put_line(v_1||' - '||v_2||' = '||v_3);
dbms_output.put_line('constant c_1 is :'||all_object.c_1);
end;
--8.存储过程,对表中数据进行修改
procedure p_2(a int,b int,c int) as
begin
update tint set val1=a,val2=b where id=c;
end;
end all_object;
/
/********3.包中对象调用********/
--修改表tint中id为1的数据为100,50
call all_object.p_2(100,50,1);
--将表tint中2、3列值相加,并返回结果,3代表取前3个结果
call all_object.add_2(3);
--实现两个变量相减,并返回结果;调用公有常量并返回结果
call all_object.p_1();
/********4.清理环境********/
drop package all_object;
drop table tint;
执行结果:
vbnet
> call all_object.p_2(100,50,1);
Routine executed.
> call all_object.add_2(3);
Routine executed.
1 is:150
2 is:22
3 is:33
> call all_object.p_1();
Routine executed.
100 - 20 = 80
constant c_1 is :常量测试
希望本文能够帮助读者更好地理解和使用GBase8s数据库中的包,从而在数据库编程领域取得更大的成功。如果您对GBase8s数据库的包有任何疑问或需要进一步的帮助,请随时联系我们。
原文链接:www.gbase.cn/community/p...
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。