1

我有包裹:

create or replace PACKAGE overload_pkg IS
  PROCEDURE what_am_i (p_x IN VARCHAR2);
  PROCEDURE what_am_i (p_x IN NUMBER);
  PROCEDURE what_am_i (p_x IN DATE);
END overload_pkg;

与身体:

create or replace PACKAGE BODY overload_pkg IS
  PROCEDURE what_am_i (p_x IN VARCHAR2) IS
  BEGIN 
    pri('Here I am, a VARCHAR2');
  END what_am_i;
  PROCEDURE what_am_i (p_x IN NUMBER) IS
  BEGIN 
    pri('Here I am, a NUMBER');
  END what_am_i;
  PROCEDURE what_am_i (p_x IN DATE) IS
    BEGIN 
    pri('Here I am, a DATE');
  END what_am_i;
END overload_pkg;

然而,当我调用包程序时:

BEGIN 
  overload_pkg.what_am_i('varchar2');
  overload_pkg.what_am_i(1234);
  overload_pkg.what_am_i('2018-04-06');
END;

,或我能想到的任何其他日期格式,Oracle 认为它是 VARCHAR 或 NUMBER。输出:

我在这里,一个 VARCHAR2
我在这里,一个数字
我在这里,一个 VARCHAR2

已处理报表。

唯一有效的是...

BEGIN 
  overload_pkg.what_am_i('varchar2');
  overload_pkg.what_am_i(1234);
  overload_pkg.what_am_i(to_DATE('08-APR-2018', 'DD-MON-YYYY'));
END;

但我认为 Oracle 可以识别日期,因为它会进行隐式转换。我很困惑。

提前致谢。

4

2 回答 2

2

这是预期的;当你跑的时候

overload_pkg.what_am_i('2018-04-06');

您将字符串传递给程序;看到单引号和介于两者之间的东西吗?嗯,是的 - 那是一个字符串,VARCHAR2.

隐式转换在这里不算;如果您DATE在某些查询中使用该字符串(看起来像 a ),它可能会。Oracle 不必在这里转换任何东西。您发送了一个字符串,它被检测到,并执行了适当的过程。

如果你想传递 a DATE,那么就这样做 - 要么使用总是以格式出现的DATE 字面量,要么应用具有适当格式掩码的函数。DATE 'YYYY-MM-DD'TO_DATE

于 2018-04-08T13:04:51.620 回答
1

你可以使用DATE文字

BEGIN
   overload_pkg.what_am_i(DATE '2018-04-06');
END

如何解决子程序调用

为了解决同一范围内可能名称相似的子程序之间的调用,编译器必须找到实际参数和形式参数之间的精确匹配。它们必须在数量、顺序和数据类型上匹配(除非为某些形式参数分配了默认值)。如果未找到匹配项或找到多个匹配项,则编译器会生成语义错误。

于 2018-04-08T12:58:59.593 回答