plsql語法之_PRAGMA RESTRICT_REFERENCES()

wisdomone1發表於2011-07-21

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-702737/,如需轉載,請註明出處,否則將追究法律責任。

相關文章