Какой параметр базы данных мне нужно проверить в Oracle для параметра DATE по умолчанию в функции? - PullRequest
0 голосов
/ 16 июня 2020

У меня следующая странная проблема. У меня есть следующая процедура в пакете:

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

Как на dev, так и на prod, тип oracledb для параметров IN установлен на STRING.

Выполнение select sysdate from dual возвращает тот же формат даты в обоих БД: 16-JUN-20.

Таким образом, любой намек на решение этой проблемы будет очень признателен.

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Если процедура ожидает DATE, не предоставляйте STRING .

Это строка:

'01/06/2020'

Это даты:

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

Выберите вариант, который вам больше всего подходит; если вы всегда будете передавать дату (без компонента времени), литерал даты (который всегда имеет формат date 'yyyy-mm-dd') в порядке. Если вы будете скоротать время, то лучше выбрать to_date (с соответствующей маской формата).

0 голосов
/ 16 июня 2020

Вместо 01/06/2020 используйте

  • to_date('01/06/2020','dd/mm/yyyy') или

  • date '2020-06-01' - литерал даты

Чтобы узнать формат даты, используемый вашей сессией / базой данных, вы можете использовать представление NLS_SESSION_PARAMETERS или NLS_DATABASE_PARAMETERS (имя параметра: NLS_DATE_FORMAT). Но рекомендуется использовать указанный формат c с to_date или date literal, поскольку NLS_DATE_FORMAT может измениться со временем, и ваш код не будет работать.

0 голосов
/ 16 июня 2020

У этой ошибки может быть много причин. Например, это может быть параметр NLS_DATE_FORMAT или параметр формата в функции 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> 
...