RESTRICT_REFERENCES的意思

lishiran發表於2007-03-27
RESTRICT_REFERENCES,這個PRAGMA比較複雜,從字面上也看不到什麼。[@more@] 總的來說,它是一個程式輔助檢驗碼,檢查子程式的純度(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在執行是對它們不能檢查。

這個編譯指令只能在程式包及物件型別說明部分指定。

以下是個例子,在編譯程式包體時報錯,它違反了RNDS規則。

create or replace package test_pragma as
function return date;
pragma restrict_references(test,rnds);
end;
/

create or replace package body test_pragma as
function test return date
as
vdate date;
begin
select sysdate into vdate from dual;
return vdate;
end test;
end test_pragma;
/

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

相關文章