儲存過程 函式

Diy_os發表於2015-04-11
pl/sql中,匿名塊我們要想下一次執行,則需要儲存在磁碟介質上,這樣每次用的時候,很麻煩。下面簡單的介紹儲存過程
儲存過程:
不帶引數的儲存過程:
create or replace procedure WOO is
 v_sum  number  :=0;
begin
 for i in 1 .. 100
   loop
     v_sum := v_sum + i;
     end loop;
     DBMS_OUTPUT.PUT_LINE(v_sum);
  end WOO;
呼叫:
我們在pl/sql中測試:
begin
  -- Call the procedure
  woo;
end;
5050
在sqlplus中測試:
SQL> execute woo;     ==>(EXEC)
5050


PL/SQL 過程已成功完成。
或者:
SQL> begin
  2  woo;
  3  end;
  4  /
5050


PL/SQL 過程已成功完成。

帶引數的儲存過程:
使用者hr裡有張表t
我們向t裡插進資料行:
create or replace procedure P_t(p_id in int, p_name in varchar2) is
begin
  insert into t values(p_id,p_name);
  COMMIT;
end P_t;
在pl/sql測試: 
begin
  -- Call the procedure
  p_t(p_id => :p_id,
      p_name => :p_name);
end;
下面輸入視窗裡的型別是float,string,oracle裡沒有這連個型別,我想應該是工具的問題.

我們根據id查詢name:
create or replace procedure P_i(p_id in number, p_name out varchar2) is         ==>注意這裡的型別後面不需要加精度,只需要寫上變數的型別
begin
  select name into p_name from t where id=p_id;
end P_i;
在pl/sql裡執行:

我們在sqlplus裡執行: 
SQL> declare
  2  v_name  varchar2(10);      ==>注意這裡我們需要定義一個變數用來接收傳出的p_name
  3  begin
  4  P_I(1,v_name);
  5  DBMS_OUTPUT.PUT_LINE(v_name);
  6  end;
  7  /
wang
PL/SQL 過程已成功完成。
       
我們根據輸入的ID來查詢name:
create or replace procedure P_n(p_id_name in out varchar2)
is
begin
  select name into p_id_name from t where id =to_number( p_id_name); ==>注意這裡我們強制轉換,oracle也會自動轉換,但是如果自己不強制轉換,如果id上有索引,則就不走索引了
end P_n;
在pl/sql裡測試:


透過上面的帶引數舉例,細心的讀者已經發現已經說明了在pl/sql中很讓初學者頭疼的in , out ,  in  out引數:
in:在塊中不可以改變,傳進去的數不可以改變,如果上面的塊中有p_id=3,則會報錯
out:OUT表示從儲存過程返回引數
in  out :IN OUT 表示傳遞引數和返回引數


函式:
上面已經介紹了儲存過程,儲存過程可以代替函式,只是函式有返回值。過程和函式很多相似,下面簡述函式:
不帶引數的函式:
create or replace function jisuan return number is
 v_sum  number :=0;
begin
  for i in 1..100
    loop
     v_sum := v_sum + i;
     end loop;
     DBMS_OUTPUT.PUT_LINE(v_sum);
     return v_sum ;
end  jisuan; ==>這裡可以寫上函式名稱或者直接省略也行

帶引數的函式:
create or replace function f_diy(r in number) return number is
  s number := 0;
  PI  constant number := 3.14159;
begin
  s :=PI*r*r;
  return s;
  DBMS_OUTPUT.PUT_LINE(s);
end f_diy;
在sqlplus裡執行:
SQL> select f_diy(90) wang  from dual;


      WANG
----------
 25446.879
                       


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1564514/,如需轉載,請註明出處,否則將追究法律責任。

相關文章