暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

DM8包的解释与应用

原创 吃多块西多士 2021-09-17
655

DM 支持 DMSQL 程序包来扩展数据库功能,用户可以通过包来创建应用程序或者使用包来管理过程和函数。

创建包

包的创建包括包规范和包主体的创建。

创建包规范

语法格式图例:
image.png
使用说明:
1.包规范中定义的对象对于包主体而言都是可见的,不需要声明就可以直接引用。这些对象包括变量、游标、异常定义和类型定义;
2.包主体中不能使用未在包规范中声明的对象;
3.包主体中的过程、函数定义必须和包规范中的前向声明完全相同。包括过程的名字、参数定义列表的参数名和数据类型定义;
4.包中可以有重名的过程和函数,只要它们的参数定义列表不相同。系统会根据用户的调用情况进行重载(OVERLOAD);
5.用户在第一次访问包(如调用包内过程、函数,访问包内变量)时,系统会自动将包对象实例化。每个会话根据数据字典内的信息在本地复制包内变量的副本。如果用户定义了 PACKAGE 的初始化代码,还必须执行这些代码(类似于一个没有参数的构造函数执行);
6.对于一个会话,包头中声明的对象都是可见的,只要指定包名,用户就可以访问这些对象。可以将包头内的变量理解为一个 SESSION 内的全局量;
7.关于包内过程、函数的调用:DM 支持按位置调用和按名调用参数两种模式。除了需要在过程、函数名前加入包名作为前缀,调用包内的过程、函数的方法和普通的过程、函数并无区别;
8.包体内声明的变量、类型、方法以及实现的未在包头内声明的方法被称作本地变量、方法,本地变量、方法只能在包体内使用,用户无法直接使用; 9.在包体声明列表中,本地变量必须在所有的方法实现之前进行声明;本地方法必须在使用之前进行声明或实现;
10.如果创建包时,在函数定义中使用 DETERMINISTIC 指定该函数为确定性函数,在函数实现中可以省略指定该函数的确定性;如果函数定义中没有指定该函数为确定性函数,则函数实现时不能指定该函数为确定性函数。
11.结果集缓存 RESULT_CACHE,只是语法支持,没有实际意义。

创建包主体

语法格式图例:
image.png
使用说明
1. 包部件可以以任意顺序出现,其中的对象必须在引用之前被声明;
2. 过程和函数的声明都是前向声明,包规范中不包括任何实现代码。
权限

  1. 使用该语句的用户必须是 DBA 或该包对象的拥有者且具有 CREATE PACKAGE 数据库权限的用户;
  2. 可以用关键字 AUTHID DEFINER |AUTHID CURRENT_USER 指定包的调用者权限,若为 DEFINER,则采用包定义者权限,若为 CURRENT_USER 则为当前用户权限,默认为包定义者权限。

重编译包

重新对包进行编译,如果重新编译失败,则将包置为禁止状态。
重编功能主要用于检验包的正确性。
语法格式图例:
image.png

删除包

语法格式图例:
image.png
使用说明
1.删除不存在的包规范会报错。若指定 IF EXISTS 关键字,删除不存在的包规范,不会报错;
2.如果被删除的包不属于当前模式,必须在语句中指明模式名;
3.如果一个包规范被删除,那么对应的包主体被自动删除。
权限
执行该操作的用户必须是该包的拥有者,或者具有 DBA 权限。

删除包主体

语法格式图例:
image.png
使用说明
1.删除不存在的包主体会报错。若指定 IF EXISTS 关键字,删除不存在的包主体,不会报错;
2.如果被删除的包不属于当前模式,必须在语句中指明模式名。
权限
执行该操作的用户必须是该包的拥有者,或者具有 DBA 权限。

一个完整的应用实例

先创建一个实例数据库

CREATE TABLE Person(Id INT IDENTITY, Name VARCHAR(100), City VARCHAR(100));
INSERT INTO Person(Name, City) VALUES('Tom','武汉');
INSERT INTO Person(Name, City) VALUES('Jack','北京');
INSERT INTO Person(Name, City) VALUES('Mary','上海');

此时表中数据应为:
image.png

创建一个包规范

CREATE OR REPLACE PACKAGE PersonPackage AS
 E_NoPerson EXCEPTION; 
 PersonCount INT; 
 Pcur CURSOR; 
 PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100)); 
 PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100)); 
 PROCEDURE RemovePerson(Pid INT);
 FUNCTION GetPersonCount RETURN INT; 
 PROCEDURE PersonList; 
END PersonPackage;

这个包规范的部件中包括 1 个变量定义,1 个异常定义,1 个游标定义,4 个过程定义和 1 个函数定义。
以下是一个包主体的实例,它对应于前面的包规范定义,包括 4 个子过程和 1 个子函数的代码实现。在包主体的末尾,是这个包对象的初始化代码。当一个会话第一次引用包时,变量 PersonCount 被初始化为 Person 表中的记录数。

创建包主体

CREATE OR REPLACE PACKAGE BODY PersonPackage AS
 PROCEDURE AddPerson(Pname VARCHAR(100), Pcity varchar(100) )AS
 BEGIN
 INSERT INTO Person(Name, City) VALUES(Pname, Pcity); 
 PersonCount = PersonCount + SQL%ROWCOUNT; 
 END AddPerson;
 PROCEDURE RemovePerson(Pname VARCHAR(100), Pcity varchar(100)) AS
 BEGIN
 DELETE FROM Person WHERE NAME LIKE Pname AND City like Pcity;
PersonCount = PersonCount - SQL%ROWCOUNT; 
 END RemovePerson; 
 PROCEDURE RemovePerson(Pid INT) AS
 BEGIN
 DELETE FROM Person WHERE Id = Pid; 
 PersonCount = PersonCount - SQL%ROWCOUNT; 
 END RemovePerson; 
 FUNCTION GetPersonCount RETURN INT AS
 BEGIN
 RETURN PersonCount; 
 END GetPersonCount; 
 PROCEDURE PersonList AS
 DECLARE
 V_id INT; 
 V_name VARCHAR(100); 
 V_city VARCHAR(100); 
 BEGIN
 IF PersonCount = 0 THEN
 RAISE E_NoPerson; 
 END IF; 
 OPEN Pcur FOR SELECT Id, Name, City FROM Person; 
 LOOP
 FETCH Pcur INTO V_id,V_name,V_city; 
 EXIT WHEN Pcur%NOTFOUND;
 PRINT ('No.' || (cast (V_id as varchar(100))) || ' ' || V_name || '
来自' || V_city );
 END LOOP; 
 CLOSE Pcur; 
 END PersonList; 
BEGIN
 SELECT COUNT(*) INTO PersonCount FROM Person; 
END PersonPackage;

重新编译包

ALTER PACKAGE PersonPackage COMPILE;

调用包中的 AddPerson 过程,往数据表中增加一条记录:

CALL PersonPackage. AddPerson ('BLACK', '南京') ;

此时,数据应为
image.png

调用包中的 RemovePerson 过程,删除第二条记录:

CALL PersonPackage. RemovePerson ('Jack', '北京') ;

注意:
这里面的名字应该注意大小写
删除的语法还可以写:CALL PersonPackage. RemovePerson (2) ;

引用包中的变量

SELECT PersonPackage. PersonCount;

调用包中的过程 PersonList 查看表中的所有记录

CALL PersonPackage. PersonList;

image.png

最后修改时间:2021-09-30 15:46:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论