oracle函數創建及調用


 

創建函數的語法如下:


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM