在調用子程序時,必須事先在獨立程序內塊層次結構的某個位置聲明它,但該位置必須在調用它的位置前面。換句話說,當從頭到尾掃描SPL代碼時,必須在調用之前找到子程序聲明。
但是,有一種構造SPL代碼的方式,可使子程序的完整聲明(即,可選聲明部分、必需可執行部分和可選異常部分)出現在調用它的代碼點之后的SPL代碼中。
這通過在調用之前在SPL代碼中插入前置聲明來完成。前置聲明是子存儲過程或子函數名稱、形參和子函數的規格;如果是子函數,則返回類型。
完整子程序規格(由可選聲明部分、可執行部分和可選異常部分組成)必須與前置聲明在同一聲明部分中指定,但可出現在用前置聲明調用此子程序的其他子程序聲明之后。
前置聲明的典型用法是兩個子程序相互調用,如下所示:
DECLARE
FUNCTION add_one (
p_add IN NUMBER
) RETURN NUMBER;
FUNCTION test_max (
p_test IN NUMBER)
RETURN NUMBER
IS
BEGIN
IF p_test < 5 THEN
RETURN add_one(p_test);
END IF;
DBMS_OUTPUT.PUT('Final value is ');
RETURN p_test;
END;
FUNCTION add_one (
p_add IN NUMBER)
RETURN NUMBER
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Increase by 1');
RETURN test_max(p_add + 1);
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(test_max(3));
END;
子函數 test_max 調用子函數 add_one(后者也調用子函數 test_max),因此某一子程序需要前置聲明,這是為匿名塊聲明部分開頭的 add_one 實現的。
匿名塊所生成的輸出如下所示:
Increase by 1
Increase by 1
Final value is 5