Javascript 对于函数中的默认日期参数,我必须在Oracle中签入哪个数据库参数?

Javascript 对于函数中的默认日期参数,我必须在Oracle中签入哪个数据库参数?,javascript,oracle,node-oracledb,Javascript,Oracle,Node Oracledb,我有以下奇怪的问题。我有以下程序,在一个包中: PROCEDURE createSmth (p_param1 IN VARCHAR2, p_param2 IN NUMBER, p_param3 IN DATE, p_param4 IN DATE,

我有以下奇怪的问题。我有以下程序,在一个包中:

PROCEDURE createSmth (p_param1        IN     VARCHAR2,
                      p_param2        IN     NUMBER,
                      p_param3        IN     DATE,
                      p_param4        IN     DATE,
                      p_description   IN     VARCHAR2,
                      p_last_login    IN     VARCHAR2 DEFAULT NULL,
                      o_sid           OUT    NUMBER,
                      p_ret           OUT    NUMBER,
                      p_mess          OUT    VARCHAR2);
调用此过程的应用程序正在使用oracledb:^4.2.0。 以下是为便于阅读而格式化的开发日志:

DBService: calling stored procedure 'BEGIN pkg.createSmth(
:p_param1, 
:p_param2, 
:p_param3, 
:p_param4, 
:p_description, 
:p_last_login, 
:o_sid, 
:p_ret, 
:p_mess); END;' 

with bindings 

[{"dir":3001,"type":2001,"val":"test"},
{"dir":3001,"type":2010,"val":37},
{"dir":3001,"type":2001,"val":"01/06/2020"},
{"dir":3001,"type":2001,"val":"03/06/2020"},
{"dir":3001,"type":2001,"val":"test233"},
{"dir":3001,"type":2001,"val":"admin"},
{"dir":3003,"type":2010},
{"dir":3003,"type":2010},
{"dir":3003,"type":2001}]

pkg.createSmth: get connection - 1 ms
pkg.createSmth: execute statement - 225 ms
pkg.createSmth: get values - 225 ms

DBService: calling stored procedure 'BEGIN pkg.createSmth(
:p_param1, 
:p_param2, 
:p_param3, 
:p_param4, 
:p_description, 
:p_last_login, 
:o_sid, 
:p_ret, 
:p_mess); END;' 

with bindings 

[{"dir":3001,"type":2001,"val":"test"},
{"dir":3001,"type":2010,"val":37},
{"dir":3001,"type":2001,"val":"01/06/2020"},
{"dir":3001,"type":2001,"val":"03/06/2020"},
{"dir":3001,"type":2001,"val":"test233"},
{"dir":3001,"type":2001,"val":"admin"},
{"dir":3003,"type":2010},
{"dir":3003,"type":2010},
{"dir":3003,"type":2001}]

pkg.createSmth: get connection - 0 ms
Unexpected DB error
undefined: Error: ORA-01843: not a valid month
ORA-06512: at line 1, trace: Error: ORA-01843: not a valid month
ORA-06512: at line 1
为便于阅读,在产品中会发生以下情况:

DBService: calling stored procedure 'BEGIN pkg.createSmth(
:p_param1, 
:p_param2, 
:p_param3, 
:p_param4, 
:p_description, 
:p_last_login, 
:o_sid, 
:p_ret, 
:p_mess); END;' 

with bindings 

[{"dir":3001,"type":2001,"val":"test"},
{"dir":3001,"type":2010,"val":37},
{"dir":3001,"type":2001,"val":"01/06/2020"},
{"dir":3001,"type":2001,"val":"03/06/2020"},
{"dir":3001,"type":2001,"val":"test233"},
{"dir":3001,"type":2001,"val":"admin"},
{"dir":3003,"type":2010},
{"dir":3003,"type":2010},
{"dir":3003,"type":2001}]

pkg.createSmth: get connection - 1 ms
pkg.createSmth: execute statement - 225 ms
pkg.createSmth: get values - 225 ms

DBService: calling stored procedure 'BEGIN pkg.createSmth(
:p_param1, 
:p_param2, 
:p_param3, 
:p_param4, 
:p_description, 
:p_last_login, 
:o_sid, 
:p_ret, 
:p_mess); END;' 

with bindings 

[{"dir":3001,"type":2001,"val":"test"},
{"dir":3001,"type":2010,"val":37},
{"dir":3001,"type":2001,"val":"01/06/2020"},
{"dir":3001,"type":2001,"val":"03/06/2020"},
{"dir":3001,"type":2001,"val":"test233"},
{"dir":3001,"type":2001,"val":"admin"},
{"dir":3003,"type":2010},
{"dir":3003,"type":2010},
{"dir":3003,"type":2001}]

pkg.createSmth: get connection - 0 ms
Unexpected DB error
undefined: Error: ORA-01843: not a valid month
ORA-06512: at line 1, trace: Error: ORA-01843: not a valid month
ORA-06512: at line 1
在dev和prod上,IN参数的oracledb类型都设置为STRING

执行select sysdate from dual在两个数据库上返回相同的日期格式:16-JUN-20


因此,任何关于解决此问题的提示都将不胜感激。

导致此错误的原因可能很多。例如,它可以是NLS_DATE_格式参数,也可以是TO_DATE函数中的格式参数

您需要分析代码来修复此问题

例如:

SQL> show parameter nls_date_format

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
nls_date_format              string  DD/MM/YYYY
SQL> select to_date('06/16/2020') from dual;
select to_date('06/16/2020') from dual
               *
ERROR at line 1:
ORA-01843: not a valid month


SQL> select to_date('16/06/2020') from dual;

TO_DATE('1
----------
16/06/2020

SQL> 
而不是2020年6月1日使用

截止日期:2020年6月1日、年月日或

日期“2020-06-01”-日期文字

要了解会话/数据库使用的日期格式,可以使用NLS_会话_参数或NLS_数据库_参数视图参数名称:NLS_日期_格式。但建议使用带有to_date或date literal的特定格式,因为NLS_date_格式可能会随着时间的推移而改变,并且代码将无法工作。

如果过程需要日期,请不要提供字符串

这是字符串:

'01/06/2020'
以下是日期:

date '2020-06-01'
to_date('01/06/2020', 'dd/mm/yyyy')

选择一个最适合你的选项;如果您总是传递没有时间组件的日期,则始终采用日期“yyyy-mm-dd”格式的日期文字就可以了。若你们想打发时间,那个么使用合适的格式掩码的to_date可能是一个更好的选择。

过程参数是date。oracle数据库类型为字符串。对于节点oracledb类型和Oracle类型之间的映射,请检查是否在dev中不使用它们中的任何一个,并且它在dev中的工作方式应与在dev中的工作方式相同,会话使用的NLS_DATE_格式必须是dd/mm/yyyy,这与Prod不同,因此您在Prod中面临问题。这就是为什么建议始终使用to_DATE或DATE文本来创建答案中提到的日期。