oracle 包純度層級
PRAGMA RESTRICT_REFERENCES(),這個PRAGMA比較複雜, 總的來說,它是一個程式輔助檢驗碼,檢查子程式的純度(PURITY),協助檢驗子程式是否有違反規則的地方。一般用在函數上,但當函數調用過程時,也要作相應的設定檢查。這是為了避免當在DML語句上調用函數時正常執行不至於產生錯誤。
文法,PRAGMA RESTRICT_REFERENCES(function_name | default , )RNDS, WNDS, RNPS, WNPS) | , TRUST);
RNDS,WNDS,RNPS,WNPS可以同時指定。但當TRUST指定是,其它的被忽略。
DEFAUT是指作用在該程式包上的所有子程式,函數。
RNDS(Read No Database State),規定子程式不能讀取任何的資料庫狀態資訊。(即不會查詢資料庫的任何錶,包括DUAL虛表)
RNPS(Read No Package State),規定子程式不能讀取任何程式包的狀態資訊,如變數等。
WNDS(Write No Database State),規定子程式不能向資料庫寫入任何資訊。(即不能修改資料庫表)
WNPS(Write No Package State),規定子程式不能向程式包寫入任何資訊。(即不能修改程式包變數的值)
TRUST,指出子程式是可以相信的不會違反一個或多個規則。這個選項是需要的當用C或JAVA寫的函數通過PL/SQL調用時,因為PL/SQL在運行是對它們不能檢查。
樣本:create or replace package purity is
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
select max(sal) into maxsal from emp; return maxsal;
end;
function min_sal return number as
begin
select min(sal) into minsal from emp; return minsal;
end;
對該包進行編譯時間提示“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
minsal number(9);
maxsal number(9);
function max_sal return number;
function min_sal return number;
pragma restrict_references(max_sal, wnps);
pragma restrict_references(min_sal, wnps);
end;
create or replace package body purity is
function max_sal return number as
begin
return maxsal;
end;
function min_sal return number as
begin
return minsal;
end;
begin
select min(sal), max(sal) into minsal, maxsal from emp;
end;
--調用包的公用函數
SQL> var minsal number;
SQL> var maxsal number;
SQL> exec :minsal:=purity.min_sal;
PL/SQL procedure successfully completed
minsal
---------
800
SQL> exec :maxsal:=purity.max_sal;
PL/SQL procedure successfully completed
maxsal
---------
5000