oracle 包純度層級

來源:互聯網
上載者:User
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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.