本书是否与程序重载相矛盾

时间:2015-03-30 21:53:27

标签: oracle plsql

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 ...

2 个答案:

答案 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);

没有人能说出来。