PL/SQL:使用pragma restrict_references限制包許可權,references
在看別人的代碼的時候,發現了如下的編譯指令,
pragma restrict_references(get_attribute_name, wnds);
get_attribute_name是一個pl/sql function, 當我試圖在這個函數中往一個log表裡面插入log資訊的時候,編譯都通不過,給出如下資訊,
Error(2252,1): PLS-00452: Subprogram 'GET_AMOUNT_NAME' violates its associated pragma
看來就是上面這個pragma搞得鬼。 查了下Oracle 文檔, (http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/restrictreferences_pragma.htm#LNPLS01339)
才知道這個pragma的作用是保證上面的那個function,不會改變資料庫的狀態 wnds (Write No Database State), 而我卻在這個函數的內部進行了寫表操作,難怪為編譯出錯。
RESTRICT_REFERENCES pragma的用法如下:
PRAGMA RESTRICT_REFERENCES ( subprogram_name, [RNDS, WNDS, RNPS, WNPS, TRUST])
關鍵字和參數描述:
PRAGMA: 表示這是一個編譯指令,在編譯的時候執行
subprogram_name:PL/SQL 函數的名字
RNDS:(Read No Database State) 表示該subprogram不會查詢(query)資料庫中的表。
WNDS: (Write No Database State) 表示該subprogram不會改變資料庫中的表的資料。
RNPS:(Read No Package State) 不訪問包中的變數
WNPS:(Write No Package State) 不改變包中的變數值
TRUST:表示信任該subprogram不會違反前面的任何約束,一般用在PL/SQL調用外部函數,比如java代碼。
需要注意的是, RESTRICT_REFERENCES pragma只能出現在package specification 或者 object type specification.
下面是一個簡單的例子:
CREATE PACKAGE loans AS
FUNCTION credit_ok RETURN BOOLEAN;
PRAGMA RESTRICT_REFERENCES (credit_ok, WNDS, RNPS);
END loans;
/