應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同學 先來個簡單的 如果使用的是PL/SQL,執行後會在output中列印my first execute,那麼這裡就有了第一個功能 dbms_output.put_line,在output裡面列印結果,另外還有dbms_output. ...
應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同學
先來個簡單的
begin dbms_output.put_line('my first execute'); end;
如果使用的是PL/SQL,執行後會在output中列印my first execute,那麼這裡就有了第一個功能
dbms_output.put_line,在output裡面列印結果,另外還有dbms_output.put,這個通常不用,put不含回車,而put_line是含回車的
下麵介紹下如何寫一個完整的存儲過程,一個完整的存儲過程,如下
create or replace procedure my_first_pro(user_input varchar2) as n number; begin n := 1; dbms_output.put_line('user input values is '||user_input); dbms_output.put_line('n = '||n); end;
一個完整的存儲過程至少包含兩部分
1、創建一個叫my_first_pro的存儲過程create procedure my_first_pro as
2、begin
end;
在begin和end中間是存儲過程需要實現的功能
下麵對上面代碼做一個說明
創建存儲過程不解釋了,or replace表示使用新修改的存儲過程覆蓋現有的存儲過程,可以嘗試不加這個,如果不加的話會提示報錯存儲過程已存在,即不可覆蓋
在存儲過程名稱後面的括弧裡面,user_input varchar2這個是輸入參數,預設是in參數,如果是輸出參數,可以輸入user_output out varchar2
n number 這個是聲明變數,變數在使用前必須聲明,並表明類型,這點和c很像,具體類型可百度,常用的有number、varchar2、char(1)
n := 1 對n進行賦值,oracle里為了區分判斷使用=和賦值使用=的區別,在賦值時不能直接使用=,需要使用:=
dbms_output.put_line講過了,值得說明的是在存儲過程裡面支持oracle的sql所有功能,用法也差不多,比如這裡使用的連接符||
那麼結果就是顯示入參的values和n的賦值
先寫這些了,睡覺,明天寫for和游標
繼續,搞起來
先說下游標,oracle存儲過程裡面,游標分為顯式游標和隱式游標,聽起來很牛逼的樣子,其實很簡單,顯式游標就是需要先定義游標變數,並且在使用時候要打開游標,既然有打開那就一定有關閉,否則無限迴圈,隱式游標就簡單了,不用定義游標變數,隨用隨定義,所以一般如果能用隱式的時候都會用隱式游標
先看個隱式游標的例子
create or replace procedure hide_cursor_case as begin for i in 1.. 10 loop dbms_output.put_line(i); end loop; end;
先說下for迴圈格式
for cursor_name in i.. n loop
end loop;
以for開始,後面指定游標,這個例子裡面我並沒有在hide_cursor_case as後面指定變數,所以這裡的i是隱式游標,後面in 1.. 10即從1到10的迭代,可以理解成python裡面的range(11),再後面是迴圈的開始標記loop,最後end loop;結束,所有使用游標的處理都要在loop和end loop中進行,例子列印了1到10的數字,執行方法
begin hide_cursor_case; end;
結果是
下麵是顯式游標,當然比較麻煩了,只是介紹下,如果有人用的話還是要能看懂的,直接懵逼就不好了,我建議能用隱式的話還是不要用顯式的吧
create or replace procedure open_cursor_case as cursor1 number; cursor iscur is select level as rid from dual connect by level <= 10; begin open iscur; loop fetch iscur into cursor1; dbms_output.put_line(cursor1); exit when iscur%notfound; end loop; end;
對比一下,我就想說,誰有上面那個不用,用這個,一定是自虐狂...
下麵介紹下這個存儲過程,已經說過的就不說了,cursor1 number定義一個變數,用來接收游標返回結果,這個類型要與接收游標的類型一致
cursor指定游標,後面是游標名稱iscur,這個游標所用的sql寫在is後面,這段sql不介紹,要不然又得一大篇,單獨拿出來執行下就知道是什麼玩意了。
open iscur打開游標,剛纔說過了,顯式游標是需要打開的,後面迴圈游標和for一樣,loop開始,end loop結束,中間是游標的使用,首先fetch iscur into cursor1把游標指向的一行給變數,因為這裡的sql只有一個欄位,所以只要一個變數接收就可以了,多個變數接收用逗號分開,並註意要先定義變數,例如fetch iscur into cursor1,cursor2,具體指定幾個變數要看游標包含的欄位而定。exit when iscur%notfound這個就容易理解了,當游標找不到任何數據的時候退出。
好了,游標和for就這些,基礎寫完了,如果覺得還不錯的話,過一段時間再寫高級點的,下麵一個統計用戶下全部表數據量的存儲過程,以供學習,還是那句話,不明白多百度
create or replace procedure count_tables_pro as cursor iscur is select table_name from user_tables; sql_v varchar2(200); cnt number; begin for i in iscur loop sql_v := 'select count(9) from '||i.table_name; execute immediate sql_v into cnt; dbms_output.put_line(i.table_name||': '||cnt); end loop; end;
這個也算是個半隱式游標,留個自習吧,把這個改成純隱式游標,很簡單吧。