南大通用GBase 8s数据库包解析

原文链接: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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
fmdpenny25 分钟前
Django创建数据库表失败处理方法
数据库·python·django
BirdMan9832 分钟前
Flask中实现对User模型的增删改查,并通过Flask-Alchemy与MySQL数据库交互
数据库·mysql·flask
isolusion1 小时前
Redis 主从复制详解:实现高可用与数据备份
数据库·redis·缓存
极客先躯2 小时前
高级java每日一道面试题-2025年2月18日-数据库篇-MySQL 如何做到高可用方案?
java·数据库·mysql·架构·高可用
墨香染城城3 小时前
Mmybatis xml 连接数据库的方法
xml·数据库
不要小看我们之间的羁绊啊3 小时前
PostgreSQL 多数据库集簇配置及多数据库复制方法【流程+代码实例】
数据库·postgresql
坐山龟3 小时前
PostgreSQL16 的双向逻辑复制
数据库·笔记·postgresql
武帝为此4 小时前
【MyBatis Plus 逻辑删除详解】
数据库·oracle·mybatis
白总Server4 小时前
Bash和Zsh的主要差异是?
开发语言·网络·数据库·stm32·安全·bash·xss
佩奇搞IT4 小时前
孔夫子根剧关键字获取在售商品 API
数据库