原文链接:https://www.gbase.cn/community/post/5551
更多精彩内容尽在南大通用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。
包中对象调用示例
以下用例创建包中包含类型、变量、常量、异常、存储过程、函数、游标。
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;
复制
执行结果:
> 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数据库的包有任何疑问或需要进一步的帮助,请随时联系我们。
原文链接:https://www.gbase.cn/community/post/5551
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。