子程序重载错误
一但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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1132828/