oracle 預存程序 包 【轉】

來源:互聯網
上載者:User

標籤:lin   網路傳輸   function   roc   style   不同   參數   noi   速度   

 

一、為什麼要用預存程序?

如果在應用程式中經常需要執行特定的操作,可以基於這些操作簡曆一個特定的過程。通過使用過程可以簡化用戶端程式的開發和維護,而且還能提高用戶端程式的運行效能。

二、過程的優點?

1、先行編譯:預存程序預先編譯好放在資料庫內,減少編譯語句所花的時間。

2、緩衝:先行編譯的預存程序會進入緩衝,所以對於經常執行的預存程序,除了第一次執行外,其它次數的執行速度會明顯提高。

3、減少網路傳輸:特別是對於一些處理資料的預存程序,不必像直接使用SQL語句那樣多次傳送資料到用戶端。

4 、可維護性高:更新預存程序通常要比更改、測試和部署應用程式需要的時間和精力要少。

5、代碼的重用:一個可以重用的預存程序可以應用到應用程式的多個位置。

6、增強安全性:通過對使用者授權對預存程序的存取權限,它們可以提供對特定資料的訪問;提高資料安全性,來防止SQL注入。

三、缺點:

1、如果需要對預存程序的輸入輸出參數做更改的話,還要更改程式。

2、可移植性差:因為預存程序將應用程式的業務處理綁定到資料庫中,以此使用預存程序來處理商務邏輯限制了應用程式的可移植性。

四、建立預存程序

 1 --1、簡單的預存程序 2 create or replace procedure procedure_test 3 (p_id in varchar,p_status out varchar)  --p_id為輸入參數 ,p_status為輸出參數 4 as 5  t_name varchar2(20); 6  t_count number:=0; 7 begin 8  select votetitle,vatesum into t_name,t_count from votemaster where id=p_id; --注意:此處沒有:來賦值 9  if t_count <=0 then10      p_status:= t_name||‘:差‘;11  elsif t_count >0 and t_count <3 then12      p_status:= t_name||‘:良好‘;13  else14      p_status:= t_name||‘:優秀‘;15  end if;16 end;17 --執行18 declare 19  out_param varchar2(50);20 begin 21  procedure_test(‘1‘,out_param);22   dbms_output.put_line(out_param);23 end;24 25 --2、帶遊標的預存程序26 create or replace procedure procedure_cursor_test27 (p_id in varchar2,p_status out varchar2)28 as29   vote votemaster%rowtype; --聲明一個對象(votemaster)類型的對象30   cursor my_cur is select * from votemaster; --聲明一個遊標並填充資料31 begin32   open my_cur; --開啟遊標33        loop34           fetch my_cur into vote ; --迴圈遊標,並放入對象35           exit when my_cur%notfound; --如果沒有資料,則直接exit36           if vote.id=p_id then37              p_status := vote.votetitle||‘:‘||vote.vatesum;38              --如果想終止迴圈,可以直接exit;39           end if;40        end loop;41   close my_cur; --關閉遊標42 end;43 --執行44 declare 45  out_param varchar2(50);46 begin 47   procedure_cursor_test(‘1‘,out_param);48   dbms_output.put_line(out_param);49 end;

 

 五、程式包

1、程式包:包是一組相關過程、函數、變數、遊標、常量等PL/SQL程式設計項目的組合。它具有物件導向程式設計語言的特點,是對這些PL/SQL程式設計項目的封裝。包類似於C++或Java程式中的類,而變數相當於類中的成員變數,過程和函數相當於方法,把相關的模組歸類成為包,可使開發人員利用物件導向的方法進行預存程序的開發,從而提高系統效能。與類相同,包中的程式元素也分為公用元素和私人元素兩種,這兩種元素的區別是他們允許訪問的程式範圍不同,即他們的範圍不同。公用元素不僅可以被包中的函數、程序呼叫,也可以被包外的PL/SQl塊調用。而私人元素只能被該包內部的函數或程序呼叫。

2、使用程式包的優點:在PL/SQL設計中,使用包不僅可以使程式模組化,對外隱藏包內所使用的資訊,而寫程式包可以提高程式的運行效率。因為,當程式首次調用程式包內部的函數或過程時,Oracle將整個程式包調入記憶體,當再次調用程式包中的元素時,Oracle直接從記憶體中讀取,而不需要進行磁碟的IO操作,從而使程式的執行效率提高。

3、一個程式包分為兩部分組成:

(1)、包定義:包定義部分聲明包內資料類型、變數、常量、遊標、子程式和函數等元素,這些元素為包的共有元素。

(2)、包主體:包主題則定義了包定義部分的具體實現,在包主體中還可以聲明和實現私人元素。

 1 --包定義 2 create or replace package t_package 3 is 4   --定義過程 5   procedure append_proc(t varchar2,a out varchar2); 6   --過程的重載 7   procedure append_proc(t number,a out varchar2); 8   --定義函數 9   function append_fun(t varchar2) return varchar2;10   11 end;
 1 --包主題 2 create or replace package body t_package 3 is 4   v_t varchar2(30); 5   --私人成員函數 6   function private_fun(t varchar2) return varchar2 is 7   begin 8      v_t := t||‘hello‘; 9      return v_t;10   end;11   --實現過程12   procedure append_proc(t varchar2,a out varchar2) is13   begin14    a := t||‘hello‘; 15   end;16   --過程的重載17   procedure append_proc(t number,a out varchar2) is 18   begin 19     a := t||‘hello‘; 20   end;21   --實現函數22   function append_fun(t varchar2) 23   return varchar2 is24   begin25      v_t := t||‘hello‘;26      return v_t;27   end;28 end;

http://zxf-noimp.iteye.com/blog/1145442

oracle 預存程序 包 【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.