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