当使用包的公用函数时,它既可以作为表达式的一部分使用,也可以在SQL语句中使用。但如果要在SQL语句中引用包的公用函数,那么该公用函数不能包含DML语句(INSERT、UPDATE和DELETE),也不能读写远程包的变量。为了对的公用函数加以限制,在定义包规范时可以使用纯度级别(purity level)限制公用函数。定义纯度级别的语法如下:
WNPS:用于限制函数不能修改包变量(即不能给包变量赋值)。
RNDS:用于限制函数不能读取数据库数据(即禁止执行SELECT操作)。
RNPS:用于限制函数不能读取包变量(即不能将包变量赋值给其他变量)。
1、建立包规范
错误示例如下:
PRAGMA RESTRICT_REFERENCES (function_name,
WNDS[,WNPS][,RNDS][,RNPS]);
WNDS:用于限制函数不能修改数据库数据(即禁止执行DML操作)。
WNPS:用于限制函数不能修改包变量(即不能给包变量赋值)。
RNDS:用于限制函数不能读取数据库数据(即禁止执行SELECT操作)。
RNPS:用于限制函数不能读取包变量(即不能将包变量赋值给其他变量)。
1、建立包规范
CREATE OR REPLACE PACKAGE pkg_purity IS
minsal NUMBER(6,2);
maxsal NUMBER(6,2);
FUNCTION max_sal RETURN NUMBER;
FUNCTION min_sal RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES(max_sal,WNPS);
PRAGMA RESTRICT_REFERENCES(min_sal,WNPS);
END pkg_purity;
2、建立包体
错误示例如下:
CREATE OR REPLACE PACKAGE BODY pkg_purity IS
FUNCTION max_sal RETURN NUMBER
IS
BEGIN
SELECT MAX(sal) INTO maxsal FROM emp;
RETURN maxsal;
END;
FUNCTION min_sal RETURN NUMBER
IS
BEGIN
SELECT MIN(sal) INTO minsal FROM emp;
RETURN minsal;
END;
END pkg_purity;
在函数体内正确引用这两个变量的包体如下:
CREATE OR REPLACE PACKAGE BODY pkg_purity IS
FUNCTION max_sal RETURN NUMBER
IS
BEGIN
RETURN maxsal;
END;
FUNCTION min_sal RETURN NUMBER
IS
BEGIN
RETURN minsal;
END;
--包构造过程
BEGIN
SELECT MIN(sal),MAX(sal) INTO minsal,maxsal FROM emp;
END pkg_purity;
3、调用包的公用函数
SQL> VAR minsal NUMBER;
SQL> VAR maxsal NUMBER;
SQL> EXEC :minsal := pkg_purity.min_sal;
SQL> EXEC :maxsal := pkg_purity.max_sal();
SQL> print minsal,maxsal