【发布时间】:2018-04-08 12:58:22
【问题描述】:
我有包裹:
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;
然而,当我调用包 PROCEDUREs 时:
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 可以识别日期,因为它会进行隐式转换。我很困惑。
提前致谢。
【问题讨论】:
-
overload_pkg.what_am_i('2018-04-06');Oracle 在这里工作正常。您正在传递一个字符串 - 一系列由单引号包围的字符。字符串中的值可以成功转换为日期的事实并没有改变这一点。如果您将第二次呼叫更改为overload_pkg.what_am_i('1234');,您希望会发生什么? -
Oracle 会将字符串转换为日期仅在需要时 - 也就是说,如果日期是必需的。在您的情况下,字符串可以正常工作 - Oracle 不需要将其转换为字符串来“让事情正常工作”。也许如果您没有定义一个接受字符串的版本,它会尝试转换为日期 - 但即便如此,这也会失败,因为 Oracle 确实 not “识别日期”(不管你怎么想) ;它仅“识别日期”与会话
NLS_DATE_FORMAT参数匹配。如果您的NLS_DATE_FORMAT是'dd-MON-yyyy',则输入'2018-04-06'将不会被识别为日期。 -
@mathguy,更多好信息,谢谢!
标签: oracle plsql date-formatting plsql-package