##前置知識 ###當前讀與快照讀 當前讀 什麼是當前讀:讀取的是最新的數據,不會讀到老數據。 何時觸發:update、insert、delete、select lock in share mode、select for update時,總是當前讀。 快照讀 什麼是快照讀:讀取的是歷史版本,不是最新 ...
初看之下不免詫異,這不是一樣的嘛,這也能賺到錢?
看看procedure要註意什麼?沒有return。
再看function要註意什麼?有return。
啊這,下麵要講講返回參數和return。
這二者的區別在於,return只返回一個值,返回參數卻是可以有多個。
看看獲取返回參數的方式:把變數放到返回參數的位置。
再看return的獲取方式,跟賦值差不多。
這能看出什麼?想要獲取存儲過程的返回值,需要有變數來存儲,而return呢,則類似於x=1 + 2;無論我用不用x來存儲,1+2都等於3。
根據上面的信息個人認為:
對於一些需要計算的,只需要獲取單個值的需求,使用function;
對於一些不需要計算的,需要的獲取多個值的需求,使用procedure;
以Scott模式為例,要求輸入部門號,返回部門名,部門員工avg(sal).
這裡要求獲取多個返回值,建議使用procedure。
create or replace procedure my_produre(vdeptno in emp.deptno%type,sdname out dept.dname%type,savg_sal out emp.sal%type) as begin select dname,avg(sal) into sdname,savg_sal from emp e,dept d where e.deptno=vdeptno and e.deptno=d.deptno group by dname;
end;
/
調用的話,把變數放到返回參數的位置以獲取返回值
declare vdname dept.dname%type; vavg_sal emp.sal%type; begin my_produre(10,vdname,vavg_sal); dbms_output.put_line('部門名:'||vdname||' 平均工資:'||vavg_sal); end; /
再來個,計算個人應交稅,(網上搜的,不知道正確與否)
年不超過36k的:3%
36k到144k的:10%
144k到300k的:20%
超過300k的:25%
根據輸入的員工號,獲取年應交稅。
一般需要計算,並且返回一個計算結果的,個人認為使用函數比較好。
create or replace function my_fun(vempno in emp.empno%type) return emp.sal%type as vsal emp.sal%type; begin select case when sal*12<=36000 then sal*12*0.03 when sal*12 between 3600 and 144000 then sal*12*0.1 when sal*12 between 144000 and 300000 then sal*12*0.2 else sal*12*0.25 end into vsal from scott.emp where empno=vempno; return vsal; end; /
調用的話可以直接調用,並不是說要給變數賦值才能調用。
exec dbms_output.put_line(my_fun(7839));
附:dbms_output.put_line沒有顯示輸出結果的話,可以試試set serveroutput on