1. 程式人生 > >Oracle儲存過程完整結構講解

Oracle儲存過程完整結構講解

一、弄清我們和oracle的主僕角色關係

       我們是主人,oracle是僕人。

       它具備建立、執行和管理儲存過程的能力,而我們除了下命令其它什麼都不會

       我們只需要向oracle講清楚需要幹什麼,便能夠得到我們想要的東西

二、告訴oracle我們想建立一個什麼樣的儲存過程

        create or replace procedure prc_test(i_param1 in varchar2,i_param2 in date,i_param3 IN number ,o_result_code out varchar2)

        1、要幹嘛?:create or replace 建立或替換一樣東西(加“or replace”是需要修改時省去先刪除再重新建立的麻煩)

        2、要建立或替換什麼東西?:procedure 儲存過程(oracle還支援建立表table、表空間tablespace、同義詞synonym、序列sequence等等)

        3、給這個儲存過程取什麼名字?:prc_xxxxx(prc_開頭是為了便於一眼看出是個儲存過程)

        4、這個儲存過程執行時需不需要引數?:i_param_name in type

               i_param_name引數名,i開頭便於一眼看出是入參;

               in標識是入參,出參用out;

               type是型別,如varchar2,date,number等,多個引數用“;”隔開)

        5、這個儲存過程執行結束需不需要返回結果?:o_param_name out type,同入參

三、告訴oracle需要這個儲存過程幹什麼事

        我們知道做什麼事,但是不會做;oracle提供了很多工具和做事能力,但是不知道做什麼事。

        因此我們先得了解清楚oracle提供的工具和幹事的能力,然後加以組裝從而指導oracle幫我們把事幹掉

        3.1 存放臨時資料的容器

              在處理事情的過程中,總會臨時產生或得到一些資料,暫時不用,但又不能扔,因為後面又會用到,怎麼辦?oracle提供了幾種臨時存放的容器

              儲存過程定義和begin之間,用is/as標識

create or replace procedure prc_xxx(in,out)
as/is
臨時變數列表;
begin

              3.1.1 存放單個值——基本型別臨時變數

                       a、寫明具體變數型別

                               字串:t_param_name  varchar2(20),注意,臨時變數必須指明大小,入參不用;

                               數字:t_param_name   number(9);整型數字,最大9位數

                                  t_param_name   number(9,4);帶小數的數字,最大9位,其中小數部分4位,整數部分5位(9-4)

                               時間:t_param_name   date;

                       b、指定跟現存的某張表的某個一致

                             t_name  user.name%type;   現存有一張user表,含有欄位name,該臨時變數跟該表的name的型別一致

                             這樣寫的目的:如果要把user表的name的值臨時存放,就不需要關心到底該欄位是什麼型別,保持一致就ok了

              3.1.2 存放一條記錄——複合臨時變數

                      如果要存放的是一條記錄,比如一個使用者user,該記錄含有使用者名稱、密碼、年齡、部門等,放在一個物件變數會簡單很多

                      a、根據單張表定義複合變數

                            t_user_info  user%rowtype; 當前存在一張user表,該物件變數跟user一致,即欄位相同,每個欄位的型別和長度相同

                      b、根據多表關聯查詢定義複合變數

                            可以直接根據各表的相應欄位確定型別

type user_info is record(
     u_name     user.name%type,
     u_dept_no  depet.dept_no%type
);
t_user_info user_info;

                      c、自定義複合變數

type user_info is record(
    u_name varchar2(20),
    u_age  varchar2(500)
);
t_user_info user_info;

      3.1.3 存放多條記錄—— 遊標(陣列)臨時變數

            遊標臨時存放一個sql的查詢結果集,可以通過對該結果集進行遍歷,從而逐條處理。此處只是定義遊標,並不執行,真正的執行時開啟遊標時

cursor c_ps_action is select * from tab_user a,tab_dept b where a.dept_no=b.dept_no and  t.age >20;

        ok,oracle提供的臨時儲存變數的容器介紹完畢,支援我們存放單個值(簡單變數)、單條記錄(複合變數)、一組記錄(遊標),下面講解如何處理業務。

        3.2 使用臨時變數和入/出參

              3.2.1 使用臨時變數

                        無需新增任何額外識別符號,直接使用即可,比如定義了臨時變數t_param,使用的時候直接用t_param即可;符合物件t_user_info.u_name,即".“+屬性

              3.2.2 給臨時變數賦值

                       a、手工賦值“:=”

                             簡單變數   t_param :=11;

                       b、通過查詢sql賦值

                             普通的sql語句,查詢結果欄位後面加”into  臨時變數“

                             單個變數賦值:select  user_name into  t_u_name from tab_user ; t_u_name為臨時變數

                             多個變數賦值:select  user_name, user_age into t_u_name,t_u_age from tab_user ; 兩個變數,按先後順序賦值

                             符合物件賦值:select  user_name, user_age into  t_user_info from  tab_user ; t_user_info含有t_u_name和t_u_age欄位,若順序顛倒,可以用".屬性"指定

       3.3  執行開始和結束

              begin                             開始

                       return;                  強制結束

                       commit;                提交執行結果(若有增刪改,必須寫commit提交,否則白做)

              end 儲存過程名;            結束

關於as和is的區別:檢視只能用as,遊標只能用is,其它地方無區別