oracle软件包纯度级别PRAGMA RESTRICT_REFERENCES (),该PRAGMA很复杂,总的来说是检查子程序的纯度(PURITY )并检查子程序中是否有违反规则的地方的专业人员通常用于函数中,但在函数调用过程时,还必须进行相应的设置检查。 这是为了确保在DML语句中调用函数时成功执行不会出错。
语法,pragma restrict _ references (function _ name|default,) RNDS,WNDS,RNPS,WNPS ) |,TRUST );
RNDS、WNDS、RNPS、WNPS可以同时指定。 但是,如果TRUST指定为yes,则忽略其他。
DEFAUT是作用于该软件包的所有子程序、函数。
RNDS(readnodatabasestate )规定子程序不能读取任何数据库状态信息。 这意味着不查询包含DUAL虚拟表的数据库中的表。)
RPS(readnopackagestate )规定子程序不能读取任何包的状态信息、例如变量等。
写入数据基站(wnds )规定子程序不能向数据库写入任何内容。 也就是说,不能修改数据库表)
写入包状态(NPS )规定子程序不向包写入任何内容。 也就是说,不能更改包变量的值)
TRUST表示您相信子程序不会违反一个或多个规则。 在PL/SQL中调用用c或JAVA编写的函数时需要此选项。 这是因为无法检查PL/SQL是否正在运行。
样本:
create or replace package purity is
minsalnumber(9;
maxsalnumber(9;
function max_sal return number;
function min_sal return number;
pragma restrict _ references (max _ sal,wnps );
pragma restrict _ references (min _ sal,wnps );
结束;
createorreplacepackagebodypurityis
function max_sal return number as
比根
选择最大(sal ) into maxsal from emp; 返回最大sal;
结束;
function min_sal return number as
比根
选择最小(sal ) into minsal from emp; 返回最小;
结束;
编译此包时,出现“PACKAGE BODY SCOTT.PURITY编译错误”
错误: PLS-00452:子程序“MAX_SAL”违反了其相关编译说明
行: 2
文本: function max_sal return number
错误: PLS-00452:子程序“MIN_SAL”违反了相关的编译说明
行: 10
文本: function min_sal return number "
由于包中的函数规定不能修改包中的变量,因此在使用函数max_sal和min_sal执行赋值操作时修改了包中的变量minsal和maxsal,从而发生了编译错误。
修改为: 也就是说,函数是只读的,但不更改包变量。
create or replace package purity is
minsalnumber(9;
maxsalnumber(9;
function max_sal return number;
function min_sal return number;
pragma restrict _ references (max _ sal,wnps );
pragma restrict _ references (min _ sal,wnps );
结束;
createorreplacepackagebodypurityis
function max_sal return number as
比根
返回最大sal;
结束;
function min_sal return number as
比根
返回最小;
结束;
比根
选择最小(sal ),最大(sal ) into minsal,最大sal from EMP;
结束;
-调用包的公共函数
SQL var minsal number;
SQL var maxsal number;
sqlexec : minsal :=purity.min _ sal;
pl/sqlproceduresuccessfullycompleted
迷你版
------------
800
sqlexec : max sal :=purity.max _ sal;
pl/sqlproceduresuccessfullycompleted
最大销售
------------
5000