資料庫自定義函式
建立函式的語法如下:
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