如果函數經常對于上述情況產生確定的記錄,可以在 函數聲明中用DETERMINISTIC,這樣ORACLE會自動在內存中緩存這些記錄集,如果不確定, 產生的結果就會不確定了 1,概念及含義 1,語法 CREATE OR REPLACE FUNCTION SCHEMA.FUNTION_NAME (ARGUMENT IN NOC0PY DATATYPE) RETURN DATETYPE DETERMINISTIC IS BEGIN END; 2,指定DETERMINISTIC用于,對于調用多次同一參數相同值的過程,返回相同的結果時 3,如果你在基于函數的索引相關的表達式或者對REFRESH FAST及ENABLE QUERY REWRITE的物化視圖相關的查詢 ,必須要指定DETERMINISTIC關鍵字。 4,如果以后變更了上述表達式的定義,必須手工重建物化視圖或者基于函數的索引 5,如果一個函數使用包變量,或者訪問數據庫的方能會影響函數的結果集,則不要用DETERMINISTIC 6,使用DETERMINISTIC語句的語義規則,此處皆指是定義或聲明而非使用 1,可以在最頂級的子程序中,指包中 2,可以在包規范即包級的子程序中,但不能在包體中;指包的子程序聲明中 3,不能在一個私有子程序中(子程序:另一個子程序內部或一個包體內部),即包體或另一個子程序中的子程序 4,一個有DETERMINISTIC的子程序能調用另一個子程序, 不管被調用的子程序是否聲明DETERMINISTIC 2,示例 1,CREATE OR REPLACE FUNCTION text_length(a CLOB) RETURN NUMBER DETERMINISTIC IS BEGIN RETURN DBMS_LOB.GETLENGTH(a); END;
2, create or replace function func_deterministic(a_len t_deterministic.a%type
2 return number deterministic is 3 v_len number; 4 begin 5 select length(a) into v_len from t_deterministic where a=a_len; 6 return v_len; 7* end; SQL> /
函數已創建。
3,SQL> select func_deterministic('ab') from t_deterministic;--查詢是NULL
FUNC_DETERMINISTIC('AB') ------------------------
SQL> select func_deterministic('12') from t_deterministic;--查詢有結果
3,加與不加它的區別 4,哪些語句可以有DETERMINISTIC,此處指FUNCTION,PACKAGE,PACKAGE BODY,PROCEDURE,VIEW 1,create procedure過程中不能有DETERMINISTIC 2,CRREATE OR REPLACE PACKAGE的語法參考:Oracle? Database PL/SQL User's Guide and Reference 測試包規范 --經測試可在包規范中創建有DETERMINISTIC的函數聲明 CREATE OR REPLACE PACKAGE PKG_DETERMINISTIC AS FUNCTION FUNC_TEST RETURN NUMBER DETERMINISTIC;
END;
--續上測試,包體也可以創建有DETERMINISTIC的函數聲明 CREATE OR REPLACE PACKAGE BODY PKG_DETERMINISTIC IS function FUNC_TEST return number deterministic is v_len number; begin select length(a) into v_len from t_deterministic; return v_len; end; END PKG_DETERMINISTIC;