#存儲過程:封裝在服務器上一段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;
----------------------------------------------------------------------------------------
說明:重復出變化,把同一東西做三次,好過把十個東西做一次。
----------------------------------------------------------------------------------------
從兩個表達式返回一個非 null 值。
語法
NVL(eExpression1, eExpression2)
參數
eExpression1, eExpression2
如果 eExpression1 的計算結果為 null 值,則 NVL( ) 返回 eExpression2。如果 eExpression1 的計算結果不是 null 值,則返回 eExpression1。
eExpression1 和 eExpression2 可以是任意一種數據類型。如果 eExpression1 與 eExpression2 的結果皆為 null 值,則 NVL( ) 返回 .NULL.。
----------------------------------------------------------------------------------------