一、為什么要用存儲過程?
如果在應用程序中經常需要執行特定的操作,可以基於這些操作簡歷一個特定的過程。通過使用過程可以簡化客戶端程序的開發和維護,而且還能提高客戶端程序的運行性能。
二、過程的優點?
1、預編譯:存儲過程預先編譯好放在數據庫內,減少編譯語句所花的時間。
2、緩存:預編譯的存儲過程會進入緩存,所以對於經常執行的存儲過程,除了第一次執行外,其它次數的執行速度會明顯提高。
3、減少網絡傳輸:特別是對於一些處理數據的存儲過程,不必像直接使用SQL語句那樣多次傳送數據到客戶端。
4 、可維護性高:更新存儲過程通常要比更改、測試和部署應用程序需要的時間和精力要少。
5、代碼的重用:一個可以重用的存儲過程可以應用到應用程序的多個位置。
6、增強安全性:通過對用戶授權對存儲過程的訪問權限,它們可以提供對特定數據的訪問;提高數據安全性,來防止SQL注入。
三、缺點:
1、如果需要對存儲過程的輸入輸出參數做更改的話,還要更改程序。
2、可移植性差:因為存儲過程將應用程序的業務處理綁定到數據庫中,以此使用存儲過程來處理業務邏輯限制了應用程序的可移植性。
四、創建存儲過程
- --1、簡單的存儲過程
- create or replace procedure procedure_test
- (p_id in varchar,p_status out varchar) --p_id為輸入參數 ,p_status為輸出參數
- as
- t_name varchar2(20);
- t_count number:=0;
- begin
- select votetitle,vatesum into t_name,t_count from votemaster where id=p_id; --注意:此處沒有:來賦值
- if t_count <=0 then
- p_status:= t_name||':差';
- elsif t_count >0 and t_count <3 then
- p_status:= t_name||':良好';
- else
- p_status:= t_name||':優秀';
- end if;
- end;
- --執行
- declare
- out_param varchar2(50);
- begin
- procedure_test('1',out_param);
- dbms_output.put_line(out_param);
- end;
- --2、帶游標的存儲過程
- create or replace procedure procedure_cursor_test
- (p_id in varchar2,p_status out varchar2)
- as
- vote votemaster%rowtype; --聲明一個對象(votemaster)類型的對象
- cursor my_cur is select * from votemaster; --聲明一個游標並填充數據
- begin
- open my_cur; --打開游標
- loop
- fetch my_cur into vote ; --循環游標,並放入對象
- exit when my_cur%notfound; --如果沒有數據,則直接exit
- if vote.id=p_id then
- p_status := vote.votetitle||':'||vote.vatesum;
- --如果想終止循環,可以直接exit;
- end if;
- end loop;
- close my_cur; --關閉游標
- end;
- --執行
- declare
- out_param varchar2(50);
- begin
- procedure_cursor_test('1',out_param);
- dbms_output.put_line(out_param);
- end;
五、程序包
1、程序包:包是一組相關過程、函數、變量、游標、常量等PL/SQL程序設計元素的組合。它具有面向對象程序設計語言的特點,是對這些PL/SQL程序設計元素的封裝。包類似於C++或Java程序中的類,而變量相當於類中的成員變量,過程和函數相當於方法,把相關的模塊歸類成為包,可使開發人員利用面向對象的方法進行存儲過程的開發,從而提高系統性能。與類相同,包中的程序元素也分為公用元素和私有元素兩種,這兩種元素的區別是他們允許訪問的程序范圍不同,即他們的作用域不同。公用元素不僅可以被包中的函數、過程調用,也可以被包外的PL/SQl塊調用。而私有元素只能被該包內部的函數或過程調用。
2、使用程序包的優點:在PL/SQL設計中,使用包不僅可以使程序模塊化,對外隱藏包內所使用的信息,而寫程序包可以提高程序的運行效率。因為,當程序首次調用程序包內部的函數或過程時,Oracle將整個程序包調入內存,當再次調用程序包中的元素時,Oracle直接從內存中讀取,而不需要進行磁盤的IO操作,從而使程序的執行效率提高。
3、一個程序包分為兩部分組成:
(1)、包定義:包定義部分聲明包內數據類型、變量、常量、游標、子程序和函數等元素,這些元素為包的共有元素。
(2)、包主體:包主題則定義了包定義部分的具體實現,在包主體中還可以聲明和實現私有元素。
- --包定義
- create or replace package t_package
- is
- --定義過程
- procedure append_proc(t varchar2,a out varchar2);
- --過程的重載
- procedure append_proc(t number,a out varchar2);
- --定義函數
- function append_fun(t varchar2) return varchar2;
- end;
- --包主題
- create or replace package body t_package
- is
- v_t varchar2(30);
- --私有成員函數
- function private_fun(t varchar2) return varchar2 is
- begin
- v_t := t||'hello';
- return v_t;
- end;
- --實現過程
- procedure append_proc(t varchar2,a out varchar2) is
- begin
- a := t||'hello';
- end;
- --過程的重載
- procedure append_proc(t number,a out varchar2) is
- begin
- a := t||'hello';
- end;
- --實現函數
- function append_fun(t varchar2)
- return varchar2 is
- begin
- v_t := t||'hello';
- return v_t;
- end;
- end;