1. 程式人生 > >資料庫自定義函式

資料庫自定義函式

建立函式的語法如下:


CREATE [OR REPLACE] FUNCTION function_name
[ (argment [ { IN | OUT | IN OUT } ] Type ,
argment [ { IN | OUT | IN OUT } ] Type ]
RETURN return_type 
{ IS | AS }
<型別.變數的說明> 
BEGIN
FUNCTION_body
EXCEPTION
其它語句
END;


例:

複製程式碼
 1 CREATE OR REPLACE FUNCTION get_salary(
 2   Dept_no NUMBER, Emp_count OUT NUMBER
) 3   RETURN NUMBER 4   IS 5   V_sum NUMBER; 6 BEGIN 7   SELECT SUM(sal), count(*) INTO V_sum, emp_count 8   FROM emp WHERE deptno=dept_no; 9   RETURN v_sum; 10   EXCEPTION 11     WHEN NO_DATA_FOUND THEN 12     DBMS_OUTPUT.PUT_LINE('你需要的資料不存在!'); 13     WHEN OTHERS THEN 14     DBMS_OUTPUT.PUT_LINE(SQLCODE||
'---'||SQLERRM); 15 END get_salary;
複製程式碼

呼叫函式方法
函式宣告時所定義的引數稱為形式引數,應用程式呼叫時為函式傳遞的引數稱為實際引數。應用程式在呼叫函式時,可以使用以下三種方法向函式傳遞引數:


第一種引數傳遞格式稱為位置表示法,格式為:
例:

複製程式碼
1 DECLARE
2   V_num NUMBER;
3   V_sum NUMBER;
4 BEGIN
5   V_sum :=get_salary(30, v_num);
6   DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數:'||v_num);
7 END;
複製程式碼


第二種引數傳遞格式稱為名稱表示法,格式為 :


例:

複製程式碼
1 DECLARE
2   V_num NUMBER;
3   V_sum NUMBER;
4 BEGIN
5   V_sum :=get_salary(emp_count => v_num, dept_no => 30);
6   DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數:'||v_num);
7 END;
複製程式碼


第三種引數傳遞格式稱為混合表示法 :
例:

複製程式碼
 1 DECLARE 
 2   Var VARCHAR2(32);
 3 BEGIN
 4   Var := demo_fun('user1', 30, sex => '');
 5   DBMS_OUTPUT.PUT_LINE(var);
 6   Var := demo_fun('user2', age => 40, sex => '');
 7   DBMS_OUTPUT.PUT_LINE(var);
 8   Var := demo_fun('user3', sex => '', age => 20);
 9   DBMS_OUTPUT.PUT_LINE(var);
10 END;
複製程式碼


引數預設值
在CREATE OR REPLACE FUNCTION 語句中宣告函式引數時可以使用DEFAULT關鍵字為輸入引數指定預設值。
例:

複製程式碼
 1 CREATE OR REPLACE FUNCTION demo_fun(
 2   Name VARCHAR2,vAge INTEGER,
 3   Sex VARCHAR2 DEFAULT '')
 4   RETURN VARCHAR2 
 5 IS
 6   V_var VARCHAR2(32);
 7 BEGIN
 8   V_var := name||''||TO_CHAR(age)||'歲,'||sex;
 9   RETURN v_var;
10 END; 
複製程式碼


具有預設值的函式建立後,在函式呼叫時,如果沒有為具有預設值的引數提供實際引數值,函式將使用該引數的預設值。
但當呼叫者為預設引數提供實際引數時,函式將使用實際引數值。
在建立函式時,只能為輸入引數設定預設值,而不能為輸入/輸出引數設定預設值。
例:

複製程式碼
 1 DECLARE 
 2   Var VARCHAR(32);
 3 BEGIN
 4   Var := demo_fun('user1', 30);
 5   DBMS_OUTPUT.PUT_LINE(var);
 6   Var := demo_fun('user2', age => 40);
 7   DBMS_OUTPUT.PUT_LINE(var);
 8   Var := demo_fun('user3', sex => '', age => 20);
 9   DBMS_OUTPUT.PUT_LINE(var);
10 END;
複製程式碼


可以使用DROP語句刪除函式:
DROP FUNCTION function_name;

授權執行權給相關的使用者或角色
GRANT語法:

GRANT system_privilege | role 
TO user | role | PUBLIC [WITH ADMIN OPTION]

GRANT object_privilege | ALL ON schema.object 
TO user | role | PUBLIC [WITH GRANT OPTION]
例:

GRANT EXECUTE ON dbms_job TO PUBLIC WITH GRANT OPTION


與過程相關的許可權:
CREATE ANY PROCEDURE
DROP ANY PROCEDURE

與過程相關資料字典
USER_SOURCE ,USER_PROCEDURES ,USER_ERRORS