1. 基本概念
(1)定義
Oracle 存儲過程是一組為完成特定功能SQL 語句,具有輸入和輸出參數(shù),經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如帶有參數(shù))來執(zhí)行。
使用存儲過程具有以下優(yōu)點:
- 提高性能:由于存儲過程在數(shù)據(jù)庫服務(wù)器上執(zhí)行,可以減少網(wǎng)絡(luò)流量和數(shù)據(jù)傳輸時間。此外,由于編譯一次并多次執(zhí)行,因此還可以提高應(yīng)用程序的響應(yīng)速度。
- 保護(hù)數(shù)據(jù):通過存儲過程來操作數(shù)據(jù)庫可以防止 SQL 注入攻擊和誤操作等安全問題。
- 簡化代碼:將常見任務(wù)封裝到單個代碼塊中,并將其命名為存儲過程可以簡化應(yīng)用程序中的重復(fù)代碼。
- 維護(hù)便利:如果需要更改某些業(yè)務(wù)邏輯或查詢條件,則只需要更新一個存儲過程即可。
(2)存儲過程與函數(shù)的區(qū)別
- 函數(shù)只能返回一個值,而存儲過程可以返回多個值。
- 函數(shù)通常作為表達(dá)式使用,而存儲過程通常被調(diào)用以完成某些任務(wù)。
- 函數(shù)不能修改數(shù)據(jù)庫狀態(tài),而存儲過程可以。
(3)存儲過程與觸發(fā)器的區(qū)別
- 觸發(fā)器不能顯式地調(diào)用,而存儲過程可以。
- 觸發(fā)器的執(zhí)行是隱式的,而存儲過程是顯式的。
- 觸發(fā)器只能在表級別上定義,而存儲過程可以在數(shù)據(jù)庫級別上定義。
2. 創(chuàng)建和使用存儲過程
(1)創(chuàng)建存儲過程
CREATE OR REPLACE PROCEDURE my_procedure
AS
BEGIN
-- 執(zhí)行 SQL 語句或其他任務(wù)
END;
-
CREATE OR REPLACE
表示如果該存儲過程已經(jīng)存在,則用新代碼替換它。 -
AS
關(guān)鍵字表示開始定義存儲過程的主體。 - 存儲過程必須以
END
結(jié)尾。
(2)調(diào)用存儲過程
使用EXECUTE
或者CALL
命令來調(diào)用存儲過程。
e.g.
EXECUTE my_procedure;
或者:
CALL my_procedure();
如果存儲過程需要輸入?yún)?shù),則可以在括號內(nèi)指定參數(shù)值。
e.g.
EXECUTE my_procedure('John', 'Doe');
(3)存儲過程輸入?yún)?shù)
Oracle 存儲過程可以接收輸入?yún)?shù),這些參數(shù)允許您在運行時向程序傳遞數(shù)據(jù)。要聲明一個輸入?yún)?shù),使用 IN
關(guān)鍵字,后跟參數(shù)名稱和數(shù)據(jù)類型,參數(shù)名稱應(yīng)該清晰而易于理解,數(shù)據(jù)類型必須與傳遞的值相匹配。
e.g.
CREATE OR REPLACE PROCEDURE my_procedure (p_name VARCHAR2, p_age NUMBER)
AS
BEGIN
-- 執(zhí)行 SQL 查詢或其他任務(wù)
END;
(4)存儲過程的輸出參數(shù)
Oracle 存儲過程還可以返回一個或多個結(jié)果,這些結(jié)果稱為輸出參數(shù)。要聲明輸出參數(shù),請使用OUT
關(guān)鍵字,后跟參數(shù)名稱和數(shù)據(jù)類型。輸出參數(shù)必須在存儲過程主體中分配值,存儲過程調(diào)用必須包含相應(yīng)的變量來接收輸出值。
e.g.
CREATE OR REPLACE PROCEDURE my_procedure (p_name VARCHAR2, p_age NUMBER, p_result OUT VARCHAR2)
AS
BEGIN
-- 執(zhí)行 SQL 查詢或其他任務(wù),并將結(jié)果存儲在 p_result 變量中。
END;
3. 存儲過程最佳實踐
e.g. 根據(jù)員工的ID輸出該員工的姓名和薪水文章來源:http://www.zghlxwxcb.cn/news/detail-482149.html
CREATE OR REPLACE PROCEDURE get_employee_info (p_emp_id IN NUMBER, p_name OUT VARCHAR2, p_salary OUT NUMBER)
AS
BEGIN
SELECT employee_name, salary INTO p_name, p_salary FROM employees WHERE employee_id = p_emp_id;
EXCEPTION
WHEN no_data_found THEN
p_name := 'Unknown';
p_salary := 0;
END;
/
e.g. 利用存儲過程生成100萬條記錄:文章來源地址http://www.zghlxwxcb.cn/news/detail-482149.html
CREATE OR REPLACE Procedure FILL_TS
As
nbid1 Number(10,0);
Begin
For nbid1 In 1..10000000 Loop
Insert Into ts_insert(nbid,mc) Values(nbid1,nbid1);
End Loop;
Commit;
End;
到了這里,關(guān)于Oracle系列十五:存儲過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!