【DM】达梦数据库中的包实例

包的实现

创建测试集

DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST(
	ID INT IDENTITY(1,1),
	NAME VARCHAR(50),
	CITY VARCHAR(50)
);
INSERT INTO TEST(NAME,CITY) VALUES('叶枫','上海'),('沈淼','武汉'),('罗云','成都');

创建包规范

CREATE OR REPLACE PACKAGE PERSON AS 							--创建规范
	NOPERSON EXCEPTION;											--定义异常
	PERSONCOUNT INT;											--定义变量
	CSR CURSOR;													--定义游标
	PROCEDURE ADDPERSON(NAME VARCHAR(50),CITY VARCHAR(50));		--加人
	PROCEDURE REMOVEPERSON(V_NAME VARCHAR(50),V_CITY VARCHAR(50));	--删人
	PROCEDURE REMOVEPERSON(V_ID INT);								--重载、删人
	FUNCTION GETPERSONCOUNT RETURN INT;							--函数,返回人数
	PROCEDURE GETPERSONLIST;									--获取所有人信息
END PERSON;														--结束创建

创建包主体

CREATE OR REPLACE PACKAGE BODY PERSON AS
	PROCEDURE ADDPERSON(NAME VARCHAR(50),CITY VARCHAR(50)) AS
		BEGIN
			INSERT INTO TEST(NAME,CITY) VALUES(NAME,CITY);
			PERSONCOUNT=PERSONCOUNT+SQL%ROWCOUNT;
		END ADDPERSON;
		
	PROCEDURE REMOVEPERSON(V_NAME VARCHAR(50),V_CITY VARCHAR(50)) AS
		BEGIN
			DELETE FROM TEST WHERE NAME LIKE V_NAME AND CITY LIKE V_CITY;
			PERSONCOUNT=PERSONCOUNT-SQL%ROWCOUNT;
		END REMOVEPERSON;
	
	PROCEDURE REMOVEPERSON(V_ID INT) AS
		BEGIN
			DELETE FROM TEST WHERE ID=V_ID;
			PERSONCOUNT=PERSONCOUNT-SQL%ROWCOUNT;
		END REMOVEPERSON;
		
	FUNCTION GETPERSONCOUNT RETURN INT AS
	BEGIN
		RETURN PERSONCOUNT;
	END GETPERSONCOUNT;
	
	PROCEDURE GETPERSONLIST AS
	DECLARE
		V_ID INT;
		V_NAME VARCHAR(50);
		V_CITY VARCHAR(50);
	BEGIN
		IF PERSONCOUNT=0 THEN 
			RAISE NOPERSON;
		END IF;
		OPEN CSR FOR SELECT ID,NAME,CITY FROM TEST;
		LOOP
			FETCH CSR INTO V_ID,V_NAME,V_CITY;
			EXIT WHEN CSR%NOTFOUND;
			PRINT (CAST(V_ID AS VARCHAR(50))||'号学生是'||V_NAME||',来自'||V_CITY);
		END LOOP;
		CLOSE CSR;
	END GETPERSONLIST;
BEGIN
	SELECT COUNT(*) INTO PERSONCOUNT FROM TEST;
END PERSON

重新编译包

ALTER PACKAGE PERSON COMPILE;

调用包中的ADDPERSON过程,往表中加一条记录

SQL> CALL PERSON.ADDPERSON('赵开','北京');
DMSQL 过程已成功完成
已用时间: 1.963(毫秒). 执行号:1925.
SQL> SELECT * FROM TEST;

行号       ID          NAME CITY
---------- ----------- ---- ----
1          1           叶枫 上海
2          2           沈淼 武汉
3          3           罗云 成都
4          4           赵开 北京

已用时间: 0.412(毫秒). 执行号:1926.
SQL>

调用REMOVEPERSON过程,删除刚刚加的记录

SQL> CALL PERSON.REMOVEPERSON('赵开','北京');
DMSQL 过程已成功完成
已用时间: 13.914(毫秒). 执行号:1979.
SQL> SELECT * FROM TEST;

行号       ID          NAME CITY
---------- ----------- ---- ----
1          1           叶枫 上海
2          2           沈淼 武汉
3          3           罗云 成都

已用时间: 0.159(毫秒). 执行号:1980.

REMOVEPERSON过程重载,譬如传ID将罗云删除

SQL> CALL PERSON.REMOVEPERSON(3);
DMSQL 过程已成功完成
已用时间: 49.736(毫秒). 执行号:1989.
SQL> SELECT * FROM TEST;

行号       ID          NAME CITY
---------- ----------- ---- ----
1          1           叶枫 上海
2          2           沈淼 武汉

已用时间: 0.342(毫秒). 执行号:1990.

引用包中变量,获取总人数

SQL> SELECT PERSON.PERSONCOUNT;

行号       PERSON.PERSONCOUNT
---------- ------------------
1          2

已用时间: 0.867(毫秒). 执行号:1991.

调用包中函数,获取总人数

SQL> SELECT PERSON.GETPERSONCOUNT;

行号       GETPERSONCOUNT
---------- --------------
1          2

已用时间: 0.623(毫秒). 执行号:1992.

调用GETPERSONLIST过程查看表中详细信息

SQL> CALL PERSON.GETPERSONLIST;
1号学生是叶枫,来自上海
2号学生是沈淼,来自武汉

DMSQL 过程已成功完成
已用时间: 0.290(毫秒). 执行号:1995.

猜你喜欢

转载自blog.csdn.net/qq_42229092/article/details/107865770