创建测试集
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.