DECLARE
TYPE DateTyp IS TABLE OF DATE INDEX BY PLS_INTEGER;
TYPE NumTyp IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
hiredate DateTyp;
sal NumTyp;
PROCEDURE initial(tab OUT DateTyp, n INTEGER) IS
BEGIN
FOR i IN 1..n LOOP
tab(i) := SYSDATE;
END LOOP;
END initial;
PROCEDURE initial(tab OUT NumTyp, n INTEGER) IS
BEGIN
FOR i IN 1..n LOOP
tab(i) := 0.0;
END LOOP;
END initial;
BEGIN
Initial(hiredate, 50); --calls first(DateTyp) version
initial(sal, 100); --calls second(NumTyp) version
END;
他们给出了这个例子(他们认为是有效的)来显示子程序重载..."它们的参数类型不同。"
然后他们给出了这个限制指南:
You cannot overload two subprograms that differ only in their subtypes. For example, you cannot overload the following two subprograms:
DECLARE
...
PROCEDURE withdraw(amount INTEGER) IS
BEGIN ... END;
PROCEDURE withdraw(amount REAL) IS
BEGIN ... END;
我没有看到或理解的是什么....他们只是通过改变参数类型给出了一个例子,他们认为参数类型是有效的(第一个例子)....然后他们说它是#s不允许
第一个示例只将标签从DateTyp更改为NumTyp ....然后第二个示例仅将数量从INTEGER更改为REAL ...
答案 0 :(得分:2)
这两个例子并不矛盾。 DateType是一个日期表; NumTyp是一个数字表。这些是截然不同的类型。 INTEGER和REAL都是NUMBER的子类型,并在STANDARD包中定义为:
type NUMBER is NUMBER_BASE;
subtype FLOAT is NUMBER; -- NUMBER(126)
subtype REAL is FLOAT; -- FLOAT(63)
subtype "DOUBLE PRECISION" is FLOAT;
subtype INTEGER is NUMBER(38,0);
因此INTEGER是NUMBER的直接子类型,REAL是FLOAT的子类型,它是NUMBER的子类型。因此,INTEGER和REAL都是NUMBER的子类型,因此不能用作重载子程序之间的唯一区别。
分享并享受。
答案 1 :(得分:1)
PL / SQL文档有一个有用的附录,我认为这有助于解释其中的差异。 Find it here
它将支持的数据类型划分为多个族。 DATE,NUMBER和VARCHAR2是不同的系列。具有不同数据类型族(例如DATE和VARCHAR2)的参数的重载过程是不同的,因此是允许的。具有来自相同数据类型族(REAL和INTEGER)的参数的重载过程不是不同的,因为它们都是NUMBER类型。因此不允许这样做。
基本上,第二个过程的哪个实例执行此调用引用?
withdraw(200);
没有人能说出来。