create or replace function getsal
(
v_job emptype.etype%type
)
return number
as
cursor c_emp is select salary from emptype where etype = v_job;
v_emp c_emp%rowtype;
v_sal emptype.salary%type := 0;
v_sal_sum emptype.salary%type;
begin
open c_emp;
loop
fetch c_emp into v_emp;
exit when c_emp%notfound;
v_sal := v_sal +v_emp.salary;
end loop;
select sum(salary) into v_sal_sum from emptype;
v_sal := v_sal/v_sal_sum;
return v_sal;
end getsal;
/
variable per number;
execute :per:=getsal('CLERK');
print per;
以上代碼中注意以下2行:
v_sal emptype.salary%type := 0;
v_sal_sum emptype.salary%type;
該例子是我從書上看的,
為什麼v_sal需要初始化為0而v_sal_sum不需要?
我試過如果v_sal不初始化為0,則per值不會有輸出,求解釋原因
首先說明:
定義一個變量不管在使用之前必須要初始化。這是編寫的規范和你代碼可靠性問題,不要依賴任何隱性轉換或者存在幻想。
——————————————————————————————————————————
解釋:
第一個不初始化在你函數的執行體中運算一直是NULL(open游標沒有取到值,你可以實驗一個取到值的計算)
在進行除法運算的時候null除以任何值都等於null(也就是啥也沒有)。0/任何數都等於0,所以返回0