函式確定性定義?
(1) 概念
函式的確定性就是輸入相同的一個引數,返回的結果總是相同的。函式的確定性,在於可以根據函式名和引數來快取執行結果。Oracle在第二次輸入該引數時,會直接拿第一次的結果,不再重複執行該函式,從而提高效率。
(2) 應用場景
對於scott使用者emp表中的員工薪資,如果薪資高於或等於2000,返回1;如果薪資低於2000,返回0。
(3) 函式編寫
create or replace function get_sal_grade(salary number) return number deterministic as
begin
declare grade number;
begin
grade := salary - 2000;
if grade < 0 then
return 0;
end if;
return 1;
end;
end get_sal_grade;
/
上述函式的第一行中加入deterministic關鍵字,表明所建立的函式具有確定性。
(4) 函式呼叫
SMITH的工資為800,得到的結果應為0。
declare salary number;
begin
salary := 800;
dbms_output。put_line(‘SMITH’‘s salary grade is ’ || get_sal_grade(salary));
end;
/
執行結果:
SMITH‘s salary grade is 0
PL/SQL procedure successfully completed。
KING的工資為5000,得到的結果應為1。
declare salary number;
begin
salary := 5000;
dbms_output。put_line(’SMITH‘’s salary grade is ‘ || get_sal_grade(salary));
end;
/
執行結果:
SMITH’s salary grade is 1
PL/SQL procedure successfully completed。
(5) 函式的不確定性
比如查表的記錄數,就屬於函式的不確定性。因為表的記錄數會隨著記錄的插入或刪除而發生改變。
來自 “ ITPUB部落格 ” ,連結:http://blog。itpub。net/29485627/viewspace-1246691/,如需轉載,請註明出處,否則將追究法律責任。
比如:ABS 返回給定數字表達式的絕對值,每次輸入相同的引數值,所得的結果都是相同的,所以它是確定函式;而 GETDATA 返回當前系統時間,每次呼叫的結果都不同,所以它是非確定函式。
如果 computed_column_expression 引用任何非確定性函式,則不能在計算列上建立索引。
如果檢視引用任何非確定性函式,則不能在檢視上建立聚集索引。
使用者定義函式的確定性
使用者定義函式是確定性函式還是非確定性函式取決於函式是如何編碼的。在以下情況中使用者定義函式是確定性函式:
函式是架構繫結函式。
所有由使用者定義函式呼叫的函式(包括內建函式或其它使用者定義函式)都是確定性函式。
函式主體不引用該函式作用域以外的資料庫物件。例如,確定性函式不能引用函式的區域性表變數以外的表。
該函式不呼叫任何擴充套件儲存過程。由於擴充套件儲存過程對資料庫會產生副作用,因此呼叫擴充套件儲存過程的函式是不確定性的。副作用是對資料庫的全域性狀態的更改,如對錶的更新、對檔案或網路等外部資源的更新(例如,修改檔案或傳送電子郵件)。
不滿足以上條件的使用者定義函式標記為非確定性函式。另外,內建非確定性函式不能用在使用者定義函式的主體中。