-
要对包中的函数进行语法限制,需要设置纯度级别
- 语法:
PRAGMA RESTRICT_REFERENCES(函数名称,WNDS [,WNPS][,RNDS][,RUPS]); |
-
纯度级别:
-
使用范例
- 示例1:定义包中函数的纯度级别
CREATE OR REPLACE PACKAGE purity_pkg AS -- 定义包中的变量 v_name VARCHAR2(10) := 'mldn' ; -- 根据雇员编号删除雇员信息。但此函数不能执行更新操作 FUNCTION emp_delete_fun_wnds(p_empno emp.empno%TYPE) RETURN NUMBER ; -- 根据雇员编号查找雇员信息。但此函数不能执行SELECT操作 FUNCTION emp_find_fun_rnds(p_empno emp.empno%TYPE) RETURN NUMBER ; -- 使用新的内容修改v_name变量内容。但此函数不能修改包中的变量 FUNCTION change_name_fun_wnps(p_param VARCHAR2) RETURN VARCHAR2 ; -- 读取v_name属性内容。但此函数不能读取包中变量 FUNCTION get_name_fun_rnps(p_param NUMBER) RETURN VARCHAR2 ; PRAGMA RESTRICT_REFERENCES(emp_delete_fun_wnds, WNDS) ; -- 设置函数纯度级别 PRAGMA RESTRICT_REFERENCES(emp_find_fun_rnds, RNDS) ; -- 设置函数纯度级别 PRAGMA RESTRICT_REFERENCES(change_name_fun_wnps, WNPS) ; -- 设置函数纯度级别 PRAGMA RESTRICT_REFERENCES(get_name_fun_rnps, RNPS) ; -- 设置函数纯度级别 END ; / |
- 接上例:上例定义了四种纯度级别,现在使用范例验证
CREATE OR REPLACE PACKAGE BODY purity_pkg AS -- 根据雇员编号删除雇员信息。但此函数不能执行更新操作 FUNCTION emp_delete_fun_wnds(p_empno emp.empno%TYPE) RETURN NUMBER AS BEGIN -- 此函数由于定义了wnds纯度,所以无法执行数据表更新操作 DELETE FROM emp WHERE empno=p_empno ; RETURN 0 ; -- 满足函数要求返回数据 END ; -- 根据雇员编号查找雇员信息。但此函数不能执行SELECT操作 FUNCTION emp_find_fun_rnds(p_empno emp.empno%TYPE) RETURN NUMBER AS v_emp emp%ROWTYPE ; BEGIN -- 此函数由于定义了rnds纯度,所以无法执行数据表查询操作 SELECT * INTO v_emp FROM emp WHERE empno=p_empno ; RETURN 0 ; -- 满足函数要求返回数据 END ; -- 使用新的内容修改v_name变量内容。但此函数不能修改包中的变量 FUNCTION change_name_fun_wnps(p_param VARCHAR2) RETURN VARCHAR2 AS BEGIN -- 此函数由于定义了wnps纯度,所以函数无法修改包中的v_name变量 v_name := p_param ; RETURN '' ; -- 满足函数要求返回数据 END ; -- 读取v_name属性内容。但此函数不能读取包中变量 FUNCTION get_name_fun_rnps(p_param NUMBER) RETURN VARCHAR2 AS BEGIN -- 此函数由于定义了rnps,所以函数无法读取v_name变量 RETURN v_name ; END ; END ; / |
效果: |
-
公共函数的说明
- 如果用户在编写可被SQL直接引用的包公共函数,函数必须要符合WNDS(不能更新数据表),WNPS(不能修改包变量)和RNPS(不能读取包变量)这3个纯度
- 示例1:定义包公用函数
CREATE OR REPLACE PACKAGE purity2_pkg AS -- 定义取得雇员上缴个人所得税的函数 FUNCTION tax_fun(p_sal emp.sal%TYPE) RETURN NUMBER ; -- 定义函数纯度:不能修改数据表、不能修改或读取包变量 PRAGMA RESTRICT_REFERENCES(tax_fun,WNDS,WNPS,RNPS) ; END ; / |