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;

我没有看到或理解什么......他们只是通过改变参数类型来举例,他们说这是有效的(第一个例子)......然后他们说这是不允许的

第一个示例仅将选项卡从 DateTyp 更改为 NumTyp ....然后第二个示例仅将数量从 INTEGER 更改为 REAL ...

#1楼 票数: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 的子类型,FLOAT 是NUMBER 的子类型。 因此,INTEGER 和 REAL 都是 NUMBER 的子类型,因此不能用作重载子程序之间的唯一区别。

#2楼 票数:1

PL/SQL 文档有一个有用的附录,我认为它有助于解释差异。 在这里找到它

它将支持的数据类型划分为系列。 DATE、NUMBER 和 VARCHAR2 是不同的系列。 具有不同数据类型系列(例如 DATE 和 VARCHAR2)参数的重载过程是不同的,因此是允许的。 具有来自相同数据类型系列(REAL 和 INTEGER)的参数的重载过程没有区别,因为它们都是 NUMBER 类型。 因此它们是不被允许的。

基本上,这个调用引用了第二个过程的哪个实例?

withdraw(200);

谁也说不清。

  ask by Josh E translate from so

未解决问题?本站智能推荐:

1回复

是否可以在过程中将数组作为参数传递?

我试图在我的程序中传递一个数组作为参数,但我不断收到命令未知错误 代码 过程调用 桌子 法语中的错误,这意味着命令未知 请帮忙
5回复

如何检查Oracle 8中的包中是否存在过程?

我在这里看到一些解决方案来检查包中的过程,但它们只适用于oracle 9或10+。 但是有可能在Oracle 8i中进行此检查吗? 在Oracle 8中,您没有DBA_PROCEDURES或类似的东西。 任何帮助都会很棒。
1回复

是否可以在过程中将值与 oracle 中的行相关联?

我有一个当然适用于选择的程序,现在我想为每一行添加一个分数,以便根据它对它们进行排序。 有没有办法在 Oracle 中做这样的事情? 我有这张桌子: 其中基本上包含了大学学院的课程。 最后 3 个值是建筑物的名称、房间的编号和房间的类型,它们是包含教室的表的外键,特别是这个: 现在,当课程
1回复

在过程错误中创建 oracle sql 游标

我通过考虑我的班次表的班次表数据创建了一个计算员工工资的程序, 我的程序是, 但是当我尝试在 SQL plus 中运行这个过程时,它说编译失败。 我数了一下,发现是什么问题。 请任何人帮助我。
3回复

在过程参数中提供 Select 语句

嗨,我正在 oracle 中处理此查询,我需要从表中为过程提供许多 id。 我如何将表中的每个 id 提供给我的程序。 抱歉,我对这个有点陌生,我完全迷失了,我不知道要搜索什么。 这是 程序 这是我尝试过的 但没有工作 有没有办法实现这一目标? 希望有人帮我解决这个问题
1回复

在过程中选择Oracle

我已经在Oracle中定义了以下过程: 但是我从Oracle得到以下错误: 我不知道那里发生了什么。 它只是被分配给变量的选择语句。 有什么帮助吗?
3回复

Oracle:如何调用重载过程?

如何正确调用DBMS_OBFUSCATION_TOOLKIT.DESEncrypt ? (如果可能,不使用PL / SQL) 因为DESEncrypt超载而无效: 有没有办法选择DESENCRYPT的一个实现(可能是VARCHAR2变体)来避免这个错误?
1回复

在过程PL / SQL中创建视图

我在论坛上看过,但此问题尚无答案。 基本上,我试图在我的过程中创建一个视图,因为它比一个复杂的select语句更容易,因为它返回的是'ORA-01422精确获取返回的行数超过了请求的行数',因此似乎不起作用。底部供参考 但是,视图选项似乎无法正常工作,它会返回另一个错误“在预期以下情况之