數據庫_存儲過程簡介(oracle版)

應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同窗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;

這個也算是個半隱式遊標,留個自習吧,把這個改爲純隱式遊標,很簡單吧。

相關文章
相關標籤/搜索