過程和函數統稱爲PL/SQL子程序,他們是被命名的PL/SQL塊,被編譯後存儲在數據庫中,並經過輸入、輸出參數或輸入/輸出參數與其調用者交換信息。過程和函數的惟一區別是函數總向調用者返回數據,而過程則不返回數據。數據庫
一 建立函數express
1 建立函數安全
語法:模塊化
1 CREATE [OR REPLACE] FUNCTION function_name 2 (arg1 [ { IN | OUT | IN OUT }] type1 [DEFAULT value1], 3 [arg2 [ { IN | OUT | IN OUT }] type2 [DEFAULT value1]], 4 ...... 5 [argn [ { IN | OUT | IN OUT }] typen [DEFAULT valuen]]) 6 [ AUTHID DEFINER | CURRENT_USER ] 7 RETURN return_type 8 IS | AS 9 <類型.變量的聲明部分>
10 BEGIN 11 執行部分 12 RETURN expression 13 EXCEPTION 14 異常處理部分 15 END function_name;
i. IN,OUT,IN OUT是形參的模式。若省略,則爲IN模式。IN模式的形參只能將實參傳遞給形參,進入函數內部,但只能讀不能寫,函數返回時實參的值不變。OUT模式的形參會忽略調用時的實參值(或說該形參的初始值老是NULL),但在函數內部能夠被讀或寫,函數返回時形參的值會賦予給實參。IN OUT具備前兩種模式的特性,即調用時,實參的值老是傳遞給形參,結束時,形參的值傳遞給實參。調用時,對於IN模式的實參能夠是常量或變量,但對於OUT和IN OUT模式的實參必須是變量。函數
ii. 通常,只有在確認function_name函數是新函數或是要更新的函數時,才使用OR REPALCE關鍵字,不然容易刪除有用的函數。工具
例子: 獲取某部門的工資總和性能
1 --獲取某部門的工資總和 2 CREATE OR REPLACE 3 FUNCTION get_salary( 4 Dept_no NUMBER, 5 Emp_count OUT NUMBER) 6 RETURN NUMBER 7 IS 8 V_sum NUMBER; 9 BEGIN 10 SELECT SUM(SALARY), count(*) INTO V_sum, emp_count 11 FROM EMPLOYEES WHERE DEPARTMENT_ID=dept_no; 12 RETURN v_sum; 13 EXCEPTION 14 WHEN NO_DATA_FOUND THEN 15 DBMS_OUTPUT.PUT_LINE('你須要的數據不存在!'); 16 WHEN OTHERS THEN 17 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 18 END get_salary;
2 函數的調用開發工具
函數聲明時所定義的參數稱爲形式參數,應用程序調用時爲函數傳遞的參數稱爲實際參數。應用程序在調用函數時,可使用如下三種方法向函數傳遞參數:測試
第一種參數傳遞格式:位置表示法編碼
即在調用時按形參的排列順序,依次寫出實參的名稱,而將形參與實參關聯起來進行傳遞。用這種方法進行調用,形參與實參的名稱是相互獨立,沒有關係,強調次序纔是重要的。格式爲:
argument_value1[,argument_value2 …]
例子:計算某部門的工資總和
1 DECLARE 2 V_num NUMBER; 3 V_sum NUMBER; 4 BEGIN 5 V_sum :=get_salary(10, v_num); 6 DBMS_OUTPUT.PUT_LINE('部門號爲:10的工資總和:'||v_sum||',人數爲:'||v_num); 7 END;
第二種參數傳遞格式:名稱表示法
即在調用時按形參的名稱與實參的名稱,寫出實參對應的形參,而將形參與實參關聯起來進行傳遞。這種方法,形參與實參的名稱是相互獨立的,沒有關係,名稱的對應關係纔是最重要的,次序並不重要。格式爲:
argument => parameter [,…]
其中:argument爲形式參數,它必須與函數定義時所聲明的形式參數名稱相同parameter爲實際參數。
在這種格式中,形勢參數與實際參數成對出現,相互間關係惟一肯定,因此參數的順序能夠任意排列。
例子:計算某部門的工資總和
1 DECLARE 2 V_num NUMBER; 3 V_sum NUMBER; 4 BEGIN 5 V_sum :=get_salary(emp_count => v_num, dept_no => 10); 6 DBMS_OUTPUT.PUT_LINE('部門號爲:10的工資總和:'||v_sum||',人數爲:'||v_num); 7 END;
第三種參數傳遞格式:組合傳遞
即在調用一個函數時,同時使用位置表示法和名稱表示法爲函數傳遞參數。採用這種參數傳遞方法時,使用位置表示法所傳遞的參數必須放在名稱表示法所傳遞的參數前面。也就是說,不管函數具備多少個參數,只要其中有一個參數使用名稱表示法,其後全部的參數都必須使用名稱表示法。
例子:
1 CREATE OR REPLACE FUNCTION demo_fun( 2 Name VARCHAR2, --注意VARCHAR2不能給精度,如:VARCHAR2(10),其它相似 3 Age INTEGER, 4 Sex VARCHAR2) 5 RETURN VARCHAR2 6 AS 7 V_var VARCHAR2(32); 8 BEGIN 9 V_var := name||':'||TO_CHAR(age)||'歲.'||sex; 10 RETURN v_var; 11 END; 12
13 DECLARE 14 Var VARCHAR(32); 15 BEGIN 16 Var := demo_fun('user1', 30, sex => '男'); 17 DBMS_OUTPUT.PUT_LINE(var); 18
19 Var := demo_fun('user2', age => 40, sex => '男'); 20 DBMS_OUTPUT.PUT_LINE(var); 21
22 Var := demo_fun('user3', sex => '女', age => 20); 23 DBMS_OUTPUT.PUT_LINE(var); 24 END;
不管採用哪種參數傳遞方法,實際參數和形式參數之間的數據傳遞只有兩種方法:傳址法和傳值法。所謂傳址法是指在調用函數時,將實際參數的地址指針傳遞給形式參數,使形式參數和實際參數指向內存中的同一區域,從而實現參數數據的傳遞。這種方法又稱做參照法,即形式參數參照實際參數數據。輸入參數均採用傳址法傳遞數據。
傳值法是指將實際參數的數據拷貝到形式參數,而不是傳遞實際參數的地址。默認時,輸出參數和輸入/輸出參數均採用傳值法。在函數調用時,ORACLE將實際參數數據拷貝到輸入/輸出參數,而當函數正常運行退出時,又將輸出形式參數和輸入/輸出形式參數數據拷貝到實際參數變量中。
3 參數默認值
在CREATE OR REPLACE FUNCTION語句中聲明函數參數時可使用 DEFAULT 關鍵字爲輸入參數指定默認值。
實例:
1 CREATE OR REPLACE FUNCTION demo_fun( 2 Name VARCHAR2, 3 Age INTEGER, 4 Sex VARCHAR2 DEFAULT '男') 5 RETURN VARCHAR2 6 AS 7 V_var VARCHAR2(32); 8 BEGIN 9 V_var := name||':'||TO_CHAR(age)||'歲.'||sex; 10 RETURN v_var; 11 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;
二 存儲過程
1 建立過程
在ORACLE SERVER上創建存儲過程,能夠被多個應用程序調用,能夠向存儲過程傳遞參數,也能夠向存儲過程傳回參數.
建立過程語法:
1 CREATE [OR REPLACE] PROCEDURE procedure_name 2 ([arg1 [ IN | OUT | IN OUT ]] type1 [DEFAULT value1], 3 [arg2 [ IN | OUT | IN OUT ]] type2 [DEFAULT value1]], 4 ...... 5 [argn [ IN | OUT | IN OUT ]] typen [DEFAULT valuen]) 6 [ AUTHID DEFINER | CURRENT_USER ] 7 { IS | AS } 8 <聲明部分>
9 BEGIN 10 <執行部分>
11 EXCEPTION 12 <可選的異常錯誤處理程序>
13 END procedure_name;
實例:
用戶鏈接登記記錄
1 CREATE TABLE logtable (userid VARCHAR2(10), logdate date); 2
3 CREATE OR REPLACE PROCEDURE logexecution 4 IS 5 BEGIN 6 INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE); 7 END;
刪除指定員工記錄
1 CREATE OR REPLACE 2 PROCEDURE DelEmp 3 (v_empno IN employees.employee_id%TYPE) 4 AS 5 No_result EXCEPTION; 6 BEGIN 7 DELETE FROM employees WHERE employee_id = v_empno; 8 IF SQL%NOTFOUND THEN 9 RAISE no_result; 10 END IF; 11 DBMS_OUTPUT.PUT_LINE('編碼爲'||v_empno||'的員工已被刪除!'); 12 EXCEPTION 13 WHEN no_result THEN 14 DBMS_OUTPUT.PUT_LINE('舒適提示:你須要的數據不存在!'); 15 WHEN OTHERS THEN 16 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 17 END DelEmp;
插入員工記錄
1 CREATE OR REPLACE 2 PROCEDURE InsertEmp( 3 v_empno in employees.employee_id%TYPE, 4 v_firstname in employees.first_name%TYPE, 5 v_lastname in employees.last_name%TYPE, 6 v_deptno in employees.department_id%TYPE 7 ) 8 AS 9 empno_remaining EXCEPTION; 10 PRAGMA EXCEPTION_INIT(empno_remaining, -1); 11 /* -1 是違反惟一約束條件的錯誤代碼 */
12 BEGIN 13 INSERT INTO EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, HIRE_DATE,DEPARTMENT_ID) 14 VALUES(v_empno, v_firstname,v_lastname, sysdate, v_deptno); 15 DBMS_OUTPUT.PUT_LINE('舒適提示:插入數據記錄成功!'); 16 EXCEPTION 17 WHEN empno_remaining THEN 18 DBMS_OUTPUT.PUT_LINE('舒適提示:違反數據完整性約束!'); 19 WHEN OTHERS THEN 20 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 21 END InsertEmp;
使用存儲過程向departments表中插入數據
1 CREATE OR REPLACE 2 PROCEDURE insert_dept 3 (v_dept_id IN departments.department_id%TYPE, 4 v_dept_name IN departments.department_name%TYPE, 5 v_mgr_id IN departments.manager_id%TYPE, 6 v_loc_id IN departments.location_id%TYPE) 7 IS 8 ept_null_error EXCEPTION; -- 用戶定義的異常處理 9 PRAGMA EXCEPTION_INIT(ept_null_error, -1400); 10 ept_no_loc_id EXCEPTION; -- 用戶定義的異常處理 11 PRAGMA EXCEPTION_INIT(ept_no_loc_id, -2291); 12 BEGIN 13 INSERT INTO departments 14 (department_id, department_name, manager_id, location_id) 15 VALUES 16 (v_dept_id, v_dept_name, v_mgr_id, v_loc_id); 17 DBMS_OUTPUT.PUT_LINE('插入部門'||v_dept_id||'成功'); 18 EXCEPTION 19 WHEN DUP_VAL_ON_INDEX THEN 20 RAISE_APPLICATION_ERROR(-20000, '部門編碼不能重複'); 21 WHEN ept_null_error THEN 22 RAISE_APPLICATION_ERROR(-20001, '部門編碼、部門名稱不能爲空'); 23 WHEN ept_no_loc_id THEN 24 RAISE_APPLICATION_ERROR(-20002, '沒有該地點'); 25 END insert_dept; 26
27 -- 調用實例: 28 DECLARE 29 ept_20000 EXCEPTION; 30 PRAGMA EXCEPTION_INIT(ept_20000, -20000); 31 ept_20001 EXCEPTION; 32 PRAGMA EXCEPTION_INIT(ept_20001, -20001); 33 ept_20002 EXCEPTION; 34 PRAGMA EXCEPTION_INIT(ept_20002, -20002); 35 BEGIN 36 insert_dept(300, '部門300', 100, 2400); 37 insert_dept(310, NULL, 100, 2400); 38 insert_dept(310, '部門310', 100, 900); 39
40 /*
41 insert_dept(v_dept_name => '部門310', v_dept_id => 310, 42 v_mgr_id => 100, v_loc_id => 2400); 43 insert_dept(320, '部門320', v_mgr_id => 100, v_loc_id => 900); 44 */
45 EXCEPTION 46 WHEN ept_20000 THEN 47 DBMS_OUTPUT.PUT_LINE('ept_20000部門編碼不能重複'); 48 WHEN ept_20001 THEN 49 DBMS_OUTPUT.PUT_LINE('ept_20001部門編碼、部門名稱不能爲空'); 50 WHEN ept_20002 THEN 51 DBMS_OUTPUT.PUT_LINE('ept_20002沒有該地點'); 52 WHEN OTHERS THEN 53 DBMS_OUTPUT.PUT_LINE('others出現了其餘異常錯誤'); 54 END;
2 調用存儲過程
存儲過程創建完成後,只要經過受權,用戶就能夠在SQLPLUS 、ORACLE開發工具或第三方開發工具中來調用運行。對於參數的傳遞也有三種:按位置傳遞、按名稱傳遞和組合傳遞,傳遞方法與函數的同樣。ORACLE 使用 EXECUTE 語句來實現對存儲過程的調用:
EXEC[UTE] procedure_name( parameter1, parameter2…);
好比:
EXECUTE logexecution;
實例:
查詢指定員工記錄
1 CREATE OR REPLACE 2 PROCEDURE QueryEmp 3 (v_empno IN employees.employee_id%TYPE, 4 v_ename OUT employees.first_name%TYPE, 5 v_sal OUT employees.salary%TYPE) 6 AS 7 BEGIN 8 SELECT last_name || last_name, salary INTO v_ename, v_sal 9 FROM employees 10 WHERE employee_id = v_empno; 11 DBMS_OUTPUT.PUT_LINE('舒適提示:編碼爲'||v_empno||'的員工已經查到!'); 12 EXCEPTION 13 WHEN NO_DATA_FOUND THEN 14 DBMS_OUTPUT.PUT_LINE('舒適提示:你須要的數據不存在!'); 15 WHEN OTHERS THEN 16 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 17 END QueryEmp;
18 --調用 19 DECLARE 20 v1 employees.first_name%TYPE; 21 v2 employees.salary%TYPE; 22 BEGIN 23 QueryEmp(100, v1, v2); 24 DBMS_OUTPUT.PUT_LINE('姓名:'||v1); 25 DBMS_OUTPUT.PUT_LINE('工資:'||v2); 26 QueryEmp(103, v1, v2); 27 DBMS_OUTPUT.PUT_LINE('姓名:'||v1); 28 DBMS_OUTPUT.PUT_LINE('工資:'||v2); 29 QueryEmp(104, v1, v2); 30 DBMS_OUTPUT.PUT_LINE('姓名:'||v1); 31 DBMS_OUTPUT.PUT_LINE('工資:'||v2); 32 END;
計算指定部門的工資總和,並統計其中的職工數量
1 CREATE OR REPLACE
2 PROCEDURE proc_demo 3 ( 4 dept_no NUMBER DEFAULT 10, 5 sal_sum OUT NUMBER, 6 emp_count OUT NUMBER
7 ) 8 IS
9 BEGIN
10 SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count 11 FROM employees WHERE department_id = dept_no; 12 EXCEPTION 13 WHEN NO_DATA_FOUND THEN
14 DBMS_OUTPUT.PUT_LINE('舒適提示:你須要的數據不存在!'); 15 WHEN OTHERS THEN
16 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 17 END proc_demo; 18
19 DECLARE
20 V_num NUMBER; 21 V_sum NUMBER(8, 2); 22 BEGIN
23 Proc_demo(30, v_sum, v_num); 24 DBMS_OUTPUT.PUT_LINE('舒適提示:30號部門工資總和:'||v_sum||',人數:'||v_num); 25 Proc_demo(sal_sum => v_sum, emp_count => v_num); 26 DBMS_OUTPUT.PUT_LINE('舒適提示:10號部門工資總和:'||v_sum||',人數:'||v_num); 27 END;
在PL/SQL 程序中還能夠在塊內創建本地函數和過程,這些函數和過程不存儲在數據庫中,但能夠在建立它們的PL/SQL 程序中被重複調用。本地函數和過程在PL/SQL 塊的聲明部分定義,它們的語法格式與存儲函數和過程相同,但不能使用CREATE OR REPLACE 關鍵字。
實例:
創建本地過程,用於計算指定部門的工資總和,並統計其中的職工數量
1 DECLARE
2 V_num NUMBER; 3 V_sum NUMBER(8, 2); 4 PROCEDURE proc_demo 5 ( 6 Dept_no NUMBER DEFAULT 10, 7 Sal_sum OUT NUMBER, 8 Emp_count OUT NUMBER
9 ) 10 IS
11 BEGIN
12 SELECT SUM(salary), COUNT(*) INTO sal_sum, emp_count 13 FROM employees WHERE department_id=dept_no; 14 EXCEPTION 15 WHEN NO_DATA_FOUND THEN
16 DBMS_OUTPUT.PUT_LINE('你須要的數據不存在!'); 17 WHEN OTHERS THEN
18 DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); 19 END proc_demo;
20 --調用方法:
21 BEGIN
22 Proc_demo(30, v_sum, v_num); 23 DBMS_OUTPUT.PUT_LINE('30號部門工資總和:'||v_sum||',人數:'||v_num); 24 Proc_demo(sal_sum => v_sum, emp_count => v_num); 25 DBMS_OUTPUT.PUT_LINE('10號部門工資總和:'||v_sum||',人數:'||v_num); 26 END;
3 AUTHID
過程當中的AUTHID指令能夠告訴ORACLE,這個過程使用誰的權限運行。默任狀況下,存儲過程會做爲調用者的過程運行,可是具備設計者的特權。這稱爲設計者權利運行。
實例:
創建過程,使用AUTOID DEFINER
1 Connect HR/qaz 2 DROP TABLE logtable; 3 CREATE table logtable (userid VARCHAR2(10), logdate date); 4
5 CREATE OR REPLACE PROCEDURE logexecution 6 AUTHID DEFINER 7 IS
8 BEGIN
9 INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE); 10 END; 11
12 GRANT EXECUTE ON logexecution TO PUBLIC; 13
14 CONNECT / AS SYSDBA 15 GRANT CONNECT TO testuser1 IDENTIFIED BY userpwd1; 16
17 CONNECT testuser1/userpwd1 18 INSERT INTO HR.LOGTABLE VALUES (USER, SYSDATE); 19 EXECUTE HR.logexecution 20
21 CONNECT HR/qaz 22 SELECT * FROM HR.logtable;
創建過程,使用AUTOID CURRENT_USER
1 CONNECT HR/qaz 2
3 CREATE OR REPLACE PROCEDURE logexecution 4 AUTHID CURRENT_USER
5 IS
6 BEGIN
7 INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE); 8 END; 9
10 GRANT EXECUTE ON logexecution TO PUBLIC; 11
12 CONNECT testuser1/userpwd1 13 INSERT INTO HR.LOGTABLE VALUES (USER, SYSDATE); 14 EXECUTE HR.logexecution
4 PRAGMA AUTONOMOUS_TRANSACTION(自治事務)
在Oracle中,一個事務是從執行第一個數據管理語言(DML)語句開始,直到執行一個COMMIT語句,提交保存這個事務,或者執行一個ROLLBACK語句,放棄這次操做結束。事務的「要麼所有完成,要麼什麼都沒完成」的本性會使將錯誤信息記入數據庫表中變得很困難,由於當事務失敗從新運行時,用來編寫日誌條目的INSERT語句還未完成。
針對這種困境,Oracle提供了一種便捷的方法,即自治事務。自治事務從當前事務開始,在其自身的語境中執行。它們能獨立地被提交或從新運行,而不影響正在運行的事務。正由於這樣,它們成了編寫錯誤日誌表格的理想形式。在事務中檢測到錯誤時,您能夠在錯誤日誌表格中插入一行並提交它,而後在不丟失此次插入的狀況下回滾主事務。
由於自治事務是與主事務相分離的,因此它不能檢測到被修改過的行的當前狀態。這就好像在主事務提交以前,它們一直處於單獨的會話裏,對自治事務來講,它們是不可用的。然而,反過來狀況就不一樣了:主事務可以檢測到已經執行過的自治事務的結果。
要建立一個自治事務,您必須在匿名塊的最高層或者存儲過程、函數、數據包或觸發的定義部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION語句。在這樣的模塊或過程當中執行的SQL Server語句都是自治的。
實例:
創建過程,使用自動事務處理進行日誌記錄
1 DROP TABLE logtable; 2
3 CREATE TABLE logtable( 4 Username varchar2(20), 5 Dassate_time date, 6 Mege varchar2(60) 7 ); 8
9 CREATE TABLE temp_table( N number ); 10
11 CREATE OR REPLACE PROCEDURE log_message(p_message varchar2) 12 AS
13 PRAGMA AUTONOMOUS_TRANSACTION; 14 BEGIN
15 INSERT INTO logtable VALUES ( user, sysdate, p_message ); 16 COMMIT; 17 END log_message; 18
19 BEGIN
20 Log_message (‘About to insert into temp_table‘); 21 INSERT INTO temp_table VALUES (1); 22 Log_message (‘Rollback to insert into temp_table‘); 23 ROLLBACK; 24 END; 25
26 SELECT * FROM logtable; 27 SELECT * FROM temp_table;
創建過程,沒有使用自動事務處理進行日誌記錄
1 CREATE OR REPLACE PROCEDURE log_message(p_message varchar2) 2 AS
3 BEGIN
4 INSERT INTO logtable VALUES ( user, sysdate, p_message ); 5 COMMIT; 6 END log_message; 7
8 BEGIN
9 Log_message ('About to insert into temp_table'); 10 INSERT INTO temp_table VALUES (1); 11 Log_message ('Rollback to insert into temp_table'); 12 ROLLBACK; 13 END; 14
15 SELECT * FROM logtable; 16 SELECT * FROM temp_table;
5 刪除過程和函數
刪除過程:可使用DROP PROCEDURE命令對不須要的過程進行刪除,語法以下:
DROP PROCEDURE [user.]Procudure_name;
刪除函數:可使用DROP FUNCTION 命令對不須要的函數進行刪除,語法以下:
1 DROP FUNCTION [user.]Function_name; 2
3 --刪除上面實例建立的存儲過程與函數
4 DROP PROCEDURE logexecution; 5 DROP PROCEDURE delemp; 6 DROP PROCEDURE insertemp; 7 DROP PROCEDURE fireemp; 8 DROP PROCEDURE queryemp; 9 DROP PROCEDURE proc_demo; 10 DROP PROCEDURE log_message; 11 DROP FUNCTION demo_fun; 12 DROP FUNCTION get_salary;
6 過程與函數的比較
使用過程與函數具備以下優勢:
一、共同使用的代碼能夠只須要被編寫和測試一次,而被須要該代碼的任何應用程序(如:.NET、C++、JAVA、VB程序,也能夠是DLL庫)調用。
二、這種集中編寫、集中維護更新、你們共享(或重用)的方法,簡化了應用程序的開發和維護,提升了效率與性能。
三、這種模塊化的方法,使得能夠將一個複雜的問題、大的程序逐步簡化成幾個簡單的、小的程序部分,進行分別編寫、調試。所以使程序的結構清晰、簡單,也容易實現。
四、能夠在各個開發者之間提供處理數據、控制流程、提示信息等方面的一致性。
五、節省內存空間。它們以一種壓縮的形式被存儲在外存中,當被調用時才被放入內存進行處理。而且,若是多個用戶要執行相同的過程或函數時,就只須要在內存中加載一個該過程或函數。
六、提升數據的安全性與完整性。經過把一些對數據的操做放到過程或函數中,就能夠經過是否授予用戶有執行該過程或的權限,來限制某些用戶對數據進行這些操做。
過程與函數的相同功能有:
一、 都使用IN模式的參數傳入數據、OUT模式的參數返回數據。
二、 輸入參數均可以接受默認值,均可以傳值或傳引導。
三、 調用時的實際參數均可以使用位置表示法、名稱表示法或組合方法。
四、 都有聲明部分、執行部分和異常處理部分。
五、 其管理過程都有建立、編譯、受權、刪除、顯示依賴關係等。
使用過程與函數的原則:
一、若是須要返回多個值和不返回值,就使用過程;若是隻須要返回一個值,就使用函數。
二、過程通常用於執行一個指定的動做,函數通常用於計算和返回一個值。
三、能夠SQL語句內部(如表達式)調用函數來完成複雜的計算問題,但不能調用過程。因此這是函數的特點。