程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 存儲過程 學習筆記

Oracle 存儲過程 學習筆記

編輯:Oracle數據庫基礎
 

存儲PL/SQL單元

前面對於總結Oracle的文章總結了那麼多,重點還是關於Oracle開發的。從今天這篇文章開始,就開始總結存儲PL/SQL單元。說到存儲PL/SQL單元,很多人就很糊塗,存儲PL/SQL單元是什麼?說白了,存儲PL/SQL單元就是子程序,就是Oracle中的存儲過程、函數和包。存儲PL/SQL單元有一個名字,我們可以根據這個名字來調用PL/SQL單元。

子程序包括存儲過程和函數,如果一個子程序屬於一個包,則這個子程序被稱為包子程序;如果一個子程序不屬於任何一個包,則這個子程序被稱為獨立子程序。

說到子程序,我們是可以給子程序傳遞參數的,在具體怎麼說編寫子程序之前,我准備先說說怎麼傳參,這個傳參搞不好還很容易出錯。

 

子程序的參數

在調用存儲過程和函數時,可以向子程序中傳遞參數,子程序的參數有以下三個屬性:

  • 參數的名字
  • 參數的模式
  • 參數的數據類型

參數的名字必須為合法的PL/SQL標識符,具體的可以參見這篇《Oracle學習筆記——PL/SQL基礎知識總結》文章。對於參數的模式有以下三種:

  • IN類型(入參)
  • OUT類型(出參)
  • IN、OUT類型(既是入參,也是出參)

對於IN類型的參數,只用於傳入數據,參數的值不能被修改,如果修改了IN類型參數,則會有編譯錯誤;OUT類型的參數主要是把值返回給調用者;而IN、OUT類型的參數則同時具備了IN類型和OUT類型參數的特點。說到參數的數據類型,很多時候,我們是直接的指定數據類型為VARCHAR2NUMBER等之類的;如果在我們無法知道表或者數據列的數據類型時,我們可以使用%TYPE%ROWTYPE間接獲得參數的數據類型。關於%TYPE%ROWTYPE具體如何使用,讀過前幾篇關於Oracle文章的伙計應該不會感到陌生。接下來就開始總結這篇博文的主角——存儲過程。

 

先說存儲過程

在之前的文章中,我也寫了很多的存儲過程的示例代碼。可以看到存儲過程沒有返回值,它就是一些PL/SQL代碼的組合,由於存儲過程具有以下的一些優點,我們才在實際工作中才大量使用它:

  • 存儲過程存放在數據庫服務器中,而且是已經編譯好的,且在服務器端執行,因此執行效率高;
  • 存儲過程把商業邏輯固化在存儲過程中,還隱藏了數據,因此增強了數據安全性;
  • 存儲過程增加了程序開發的靈活性和模塊化;
  • 存儲過程是存儲在服務器端,且在服務器端執行,減少了網絡通信量。

總而言之,存儲過程是你不得不掌握的知識點。

 

創建一個存儲過程

我先來創建一個最簡單的存儲過程。

create or replace procedure pro_1(id varchar2)is
    name varchar2(20); -- 聲明一個變量begin
    -- 以下就是存儲過程的主體部分
    dbms_output.put_line('id:' || id || ' name:' || name);end;

上述代碼就是一個最簡單的存儲過程,create or replace表示如果這個存儲過程不存在就創建一個新的存儲過程,而如果這個存儲過程存在了,就覆蓋這個存儲過程;id varchar2是傳遞的一個參數,默認是IN類型。多動手,寫幾個存儲過程就領悟了。寫完了存儲過程,我們就需要編譯這個存儲過程,將它保存在數據庫中。

 

編譯存儲過程

說到編譯存儲過程,我一般都是在PL/SQL Developer上,直接UI操作就編譯好了。由於使用PL/SQL Developer編譯存儲過程屬於“無腦操作”那種的,沒有多少技術含量,這裡就主要說說如何在命令行下編譯存儲過程。

在命令行下編譯存儲過程需要用到下面的這個命令語句:

alter procedure pro_1 compile;

其中pro_1是存儲過程的命令,最重要的是執行編譯的用戶必須被授予了alter any procedure權限。編譯完了之後,接下來看看如何讓這個存儲過程跑起來。

 

調用存儲過程

說到調用存儲過程,這也得分兩種情況討論:

  • 在PL/SQL中調用存儲過程
  • 在SQL*Plus中調用存儲過程

在PL/SQL調用存儲過程就好比調用一個函數一樣,例如這樣:

begin
    pro_1(00813045);end;

對於在SQL*Plus中調用存儲過程平時我用的比較少,也比較生疏,但是也比較簡單,如下:

SQL> set serveroutput on;
SQL> execute pro_1(00813025);

使用關鍵字execute就好了,很多時候,我們需要在Linux的Shell腳本中執行儲存過程,這個時候我們就需要先使用SQL*Plus連接Oracle,然後再使用execute執行存儲過程。

 

刪除存儲過程

當你不想要它的時候,快樂的執行drop procedure pro_1;就好了,這沒有什麼,就像刪除一個表那樣輕松。

 

總結

大晚上寫了這麼一篇文章,好困,寫的比較籠統,但是對於初學者來說,這樣的一篇文章足以讓你了解Oracle的存儲過程。接下來的學習就看你自己的了,趕緊敲起鍵盤,寫上幾個存儲過程練練手吧。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved