SQL> exec salespkg.calc_total ('ZONE 15') BEGIN salespkg.calc_total ('ZONE 15'); END; * ERROR at line 1: ORA-06550:line 1, column 7: PLS-00307:too many declarations of 'CALC_TOTAL' match this call
该错误消息明确地指出了这一问题:"Too many declarations of CALC_TOTAL match this call."(有多个 CALC_TOTAL 的声明与该调用相匹配)。您可以看到,计算机并不是十分的聪明。您我都可以看出 'ZONE 15' 是一个地段;难道 PL/SQL 编译器就不能识别出这是"地段"的 calc_total 吗(即带有 zone_in 参数的重载)?不幸的是,编译器并不是这样工作的。'ZONE 15' 是字符串的字面意义,编译器无法分析。编译器无法知道应该使用哪段程序,然后就甩手不管了。
我们该如何解决这一问题呢?在这种特定情况下,我可以通过使用指定的参数值来消除多义性:
BEGIN salespkg.calc_total (zone_in => 'ZONE 15'); END;
'ZONE 15' 是固定长还是可变长?PL/SQL 文档中说道 "All string literals except the null string ('') have datatype CHAR,"(所有非空串的字符串文字都是 CHAR 型)但是编译器并没有意识到这个问题。非常希奇,即使向程序传送了一个显式声明为固定长度的字符串,仍然会出现问题。
SQL> DECLARE 2 l_zone CHAR(6) := 'ZONE15'; 3 BEGIN 4 salespkg.calc_total (l_zone); 5 END; 6 / salespkg.calc_total (l_zone); * ERROR at line 4: PLS-00307:too many declarations of 'CALC_TOTAL' match this call