PLSQL Language Reference-PL/SQL子程式-過載子程式-子程式過載錯誤

LuiseDalian發表於2014-03-30

子程式過載錯誤

一但PL/SQL編譯器判斷出它不能確定呼叫哪個子程式時,就會捕獲過載錯誤。

當子程式具有完全相同的頭部,則當編譯子程式本身或宣告它們的包規範時會捕獲過載錯誤。

其它情況就是當你編譯模稜兩可的子程式呼叫時會捕獲過載錯誤。

--引發編譯時錯誤

CREATE OR REPLACE PACKAGE pkg1 IS

    PROCEDURE s (p VARCHAR2);

    PROCEDURE s (p VARCHAR2);

END pkg1;

 

--編譯時成功,編譯呼叫的程式時出錯

CREATE OR REPLACE PACKAGE pkg2 IS

    SUBTYPE t1 IS VARCHAR2(10);

    SUBTYPE t2 IS VARCHAR2(10);

    PROCEDURE s (p t1);

    PROCEDURE s (p t2);

END pkg2;

 

CREATE OR REPLACE PROCEDURE p IS

    a pkg2.t1 := 'a';

BEGIN

    pkg2.s(a);  -- 捕獲錯誤

END p;

 

--修改函式的過載,s過程的形參名不一樣

CREATE OR REPLACE PACKAGE pkg2 IS

    SUBTYPE t1 IS VARCHAR2(10);

    SUBTYPE t2 IS VARCHAR2(10);

    PROCEDURE s (p1 t1);

    PROCEDURE s (p2 t2);

END pkg2;

 

--呼叫方式也改一下,基於名字

CREATE OR REPLACE PROCEDURE p IS

    a pkg2.t1 := 'a';

BEGIN

    pkg2.s(p1=>a);  -- 不會產生編譯錯誤

END p;

 

--沒有違背過載規則

CREATE OR REPLACE PACKAGE pkg3 IS

    PROCEDURE s (p1 VARCHAR2);

    PROCEDURE s (p1 VARCHAR2, p2 VARCHAR2 := 'p2');

END pkg3;

--會產生編譯錯誤

CREATE OR REPLACE PROCEDURE p IS

    a1 VARCHAR2(10) := 'a1';

    a2 VARCHAR2(10) := 'a2';

BEGIN

    pkg3.s(p1=>a1, p2=>a2);  -- 沒有錯誤

    pkg3.s(p1=>a1);          -- 會引起錯誤,不確定是呼叫哪一個

END p;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1132828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章