應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同窗python
先來個簡單的sql
begin dbms_output.put_line('my first execute'); end;
若是使用的是PL/SQL,執行後會在output中打印my first execute,那麼這裏就有了第一個功能oracle
dbms_output.put_line,在output裏面打印結果,另外還有dbms_output.put,這個一般不用,put不含回車,而put_line是含回車的ide
下面介紹下如何寫一個完整的存儲過程,一個完整的存儲過程,以下oop
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;
一個完整的存儲過程至少包含兩部分學習
一、建立一個叫my_first_pro的存儲過程create procedure my_first_pro asfetch
二、beginspa
end;code
在begin和end中間是存儲過程須要實現的功能blog
下面對上面代碼作一個說明
建立存儲過程不解釋了,or replace表示使用新修改的存儲過程覆蓋現有的存儲過程,能夠嘗試不加這個,若是不加的話會提示報錯存儲過程已存在,即不可覆蓋
在存儲過程名稱後面的括號裏面,user_input varchar2這個是輸入參數,默認是in參數,若是是輸出參數,能夠輸入user_output out varchar2
n number 這個是聲明變量,變量在使用前必須聲明,並代表類型,這點和c很像,具體類型可百度,經常使用的有number、varchar二、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;
這個也算是個半隱式遊標,留個自習吧,把這個改爲純隱式遊標,很簡單吧。