前面對於總結Oracle的文章總結了那麼多,重點還是關於Oracle開發的。從今天這篇文章開始,就開始總結存儲PL/SQL單元。說到存儲PL/SQL單元,很多人就很糊塗,存儲PL/SQL單元是什麼?說白了,存儲PL/SQL單元就是子程序,就是Oracle中的存儲過程、函數和包。存儲PL/SQL單元有一個名字,我們可以根據這個名字來調用PL/SQL單元。
子程序包括存儲過程和函數,如果一個子程序屬於一個包,則這個子程序被稱為包子程序;如果一個子程序不屬於任何一個包,則這個子程序被稱為獨立子程序。
說到子程序,我們是可以給子程序傳遞參數的,在具體怎麼說編寫子程序之前,我准備先說說怎麼傳參,這個傳參搞不好還很容易出錯。
在調用存儲過程和函數時,可以向子程序中傳遞參數,子程序的參數有以下三個屬性:
參數的名字必須為合法的PL/SQL標識符,具體的可以參見這篇《Oracle學習筆記——PL/SQL基礎知識總結》文章。對於參數的模式有以下三種:
對於IN類型的參數,只用於傳入數據,參數的值不能被修改,如果修改了IN類型參數,則會有編譯錯誤;OUT類型的參數主要是把值返回給調用者;而IN、OUT類型的參數則同時具備了IN類型和OUT類型參數的特點。說到參數的數據類型,很多時候,我們是直接的指定數據類型為VARCHAR2
、NUMBER
等之類的;如果在我們無法知道表或者數據列的數據類型時,我們可以使用%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調用存儲過程就好比調用一個函數一樣,例如這樣:
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的存儲過程。接下來的學習就看你自己的了,趕緊敲起鍵盤,寫上幾個存儲過程練練手吧。