【文章內(nèi)容簡介】
d or too_many_rows then (39。發(fā)生系統(tǒng)錯誤 39。)。 When others then (sqlerrm)。 END get_sal; / 例: 編寫一個函數(shù),計算幾個人的平均工資,并在函數(shù)體的循環(huán)過程中輸出結(jié)果。 CREATE OR REPLACE FUNCTION average_sal(v_n IN NUMBER(3)) RETURN NUMBER IS CURSOR c_emp IS SELECT empno, sal FROM emp; v_total_sal % TYPE:=0; v_counter number。 v_emp_no %type。 BEGIN FOR r_emp IN c_emp LOOP EXIT WHEN c_emp% ROWCOUNT> v_n OR c_emp% NOTFOUND; v_total_sal:=v_total_sal + ; v_counter:=c_emp% ROWCOUNT; v_emp_no:=; (‘ loop=’ || v_counter||‘; Empno=’ || v_emp_no); END LOOP; RETURN(v_total_sal/ v_counter); END average_sal; / 存儲過程與函數(shù)的區(qū)別 存儲過程和函數(shù)的主要差別有兩個: 一是返回值的方法不同 二是調(diào)用方法不同 ( 1)返回值的方法不同 ● 存儲函數(shù):有零個或多個參數(shù),但不能有 OUT參數(shù)。函數(shù)只返回一個值,靠 RETURN子句返回。 ● 存儲過程:有零個或多個參數(shù),過程不返回值,其返回值是靠 OUT參數(shù)帶出來的。 ( 2)調(diào)用方法不同 調(diào)用過程的語句可以作為單獨的可執(zhí)行語句在 PL/SQL塊中單獨出現(xiàn)。 如:過程名(實際參數(shù) 1,實際參數(shù) 2...); 函數(shù)可以在任何表達(dá)式能夠出現(xiàn)的地方被調(diào)用,調(diào)用函數(shù)的語句不能作為可執(zhí)行語句單獨出現(xiàn)在 PL/SQL塊中。 如:變量名: =函數(shù)名(實際參數(shù) 1,實際參數(shù) 2...) 存儲過程和函數(shù)中的出錯處理 存儲過程和函數(shù)就是一個 PL/SQL塊,所以在過程函數(shù)體內(nèi)應(yīng)該考慮出錯處理。 不管是哪種類型的出錯情況,只要在過程和函數(shù)體內(nèi)考慮了出錯處理的方法,即使在運行過程中出現(xiàn)了錯誤,過程和函數(shù)都能成功地執(zhí)行,程序不會被中斷。 如果在過程和函數(shù)體內(nèi)忽略了出錯處理,過程和函數(shù)執(zhí)行時以交互方式通知用戶出錯,讓用戶自行處理,程序被中斷。 例:根據(jù)給定的員工號,刪除該員工記錄。 CREATE OR REPLACE PROCEDURE fire_emp(p_emp_no IN % TYPE) IS invalid_employee EXCEPTION; (定義錯誤) BEGIN DELETE FROM emp WHERE empno=p_emp_no。 IF SQL% NOTFOUND THEN RAISE invalid_employee; (觸發(fā)錯誤) END IF; COMMIT WORK; EXCEPTION WHEN invalid_employee THEN (處理錯誤) ROLLBACK WORK; INSERT INTO exception_table(line_nr,line) VALUES(1,‘ Em