在調用子程序時,必須事先在獨立程序內塊層次結構的某個位置聲明它,但該位置必須在調用它的位置前面。換句話說,當從頭到尾掃描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