oracle之存儲過程和存儲函數的使用和區別


#存儲過程:封裝在服務器上一段sql片段,已經編譯好了的代碼。

1.客戶端調存儲過程,執行效率就會非常高效。

語法:

create [or replace] procedure 存儲過程名稱

           (參數名  in|out 參數類型,參數名  in|out 參數類型)is  |  as

- - 聲明部分

begin

- - 業務邏輯

end

例子: 

/*需求:給指定員工漲薪,並打印漲薪前后的工資

    參數:in員工編號(用來接受輸入) in 漲多少

    聲明一個變量:存儲漲工資前的工資(因為不確定,所以用變量)  打印漲薪前的工資  更新工資

打印漲薪后的工資

*/

create or replace procedure pro_updatesal(vempno in number, vnum in number)

is

- -聲明變量,記錄當前工資

vsal number;

begin

    - -查詢當前工資

         select sal into vsal from emp

         where empno=vempno;

    - -輸出漲薪前的工資

         dbms_output.put_line(“漲薪前:”||vsal);

    - -更新工資

         update emp set sal=vsal+vnum

         where empno=vempno;

     - -輸出漲薪后的工資

         dbms_output.put_line(“漲薪后:”||(vsal+vnum);

     - -提交事務

          commit;

end;

 

調用:

方法一:

- -在右邊的小窗口中找到一個procedures,並在其中點相應文件點右鍵,單擊view看錯誤提示。再選中再執行。

      

call proc_updatesal(7788,10);

- -再選中再執行。並在out中可以看到內容。

 

方法二:

begin

      call proc_updatesal(7788,-100);

end;

 

說明:7788是員工編號。

 

----------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------

 

 

#存儲函數:封裝在oracle在服務器里面的plsql片段,

               它是已經編譯好的代碼片段。

語法:

create [for replace] function 存儲函數的名稱(參數名 in|out 參數類型,參數名 in|out 參數類型)

return 參數類型

is | as

begin

 

end;

 

/*存儲過程和函數的區別:

1.它們本質上沒有區別

2.函數存在的意義是給過程調用 /*存儲過程中調用存儲函數*/

3.函數的返回類型在is | as上面定義

4.函數可以在sql里面直接調用

*/

例子:默認用in

/*查詢指定員工的年薪

參數:員工的編號

返回:年薪

*/

create or replace function

 func_getsal(vempno number)

 return number

is

 - -聲明變量,保存年薪

      vtotalsal number;

begin

          select sal*2+nul(comm,0) into vtotalsal

          from emp

          where empno=vempno; 

          return vtotalsal;

end; 

 

 

說明:into vtotalsal是表示賦值給 into vtotalsal,也就是年薪,並最后將年薪返回過來。

         再然后選中並運行,然后可以看到左側function中有對應的函數名,可以用view

         查看是否有錯誤。

 

- -調用存儲函數

declare

     vsal number;

begin

     vsal=func_getsal(7788); 

     dbms_output.put_line(); 

- -這里要有一個返回值

- -所以要聲明一個返回值

end;

 

- -最后可以在output中看到結果。

 

- -函數可以在sql里面直接調用

select ename,func_getsal(empno)

from emp;

 

 

—存儲過程

create or replace procedure proc_gettotalsal

(empmno in number,vtotalsal out number)

is

begin

      select sal*12+nvl(comm,0) into vtotalsal

      from emp

      where empno=vempno;

end;

 

declare

begin

       pro_gettotalsal(7788,vtotal);

       dbms_output.put_line(“年薪:”|| vtotal);

end;

 

 

----------------------------------------------------------------------------------------

 

 

說明:重復出變化,把同一東西做三次,好過把十個東西做一次。

 

 

----------------------------------------------------------------------------------------

 

#OracleNVL函數用法

 

從兩個表達式返回一個非 null 值。

語法

     

  NVL(eExpression1, eExpression2)



參數
      

 eExpression1, eExpression2



如果 eExpression1 的計算結果為 null 值,則 NVL( ) 返回 eExpression2。如果 eExpression1 的計算結果不是 null 值,則返回 eExpression1

eExpression1 eExpression2 可以是任意一種數據類型。如果 eExpression1 eExpression2 的結果皆為 null 值,則 NVL( ) 返回 .NULL.

 

----------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM