Oracle - SP Дата Входной параметр урезан? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть процедура, которая принимает некоторые входные параметры в качестве даты.Когда я пытаюсь выполнить свой SP, вот значения, назначенные каждому параметру enter image description here

Однако при выполнении я получаю сообщение об ошибке о формате даты в параметре p_schedule_value.Действительно, мы видим, что она не передает дату в указанном формате;вместо этого оно усекает время и передает его как yyyy-MMM-dd. На снимке экрана ниже вы можете увидеть dynamic_sql в выводе с сообщением об ошибке и значением p_schedule_value enter image description here

Почемумое время усекается?похоже, он игнорирует преобразование TO_DATE благодаря

EDIT : пытался удалить TO_DATE в SP, он компилируется, но время все еще усекается.Только часть даты вставлена ​​в мою строку.enter image description here

1 Ответ

1 голос
/ 15 марта 2019

В процедуре "insert_or_upd ....." аргумент p_schedule_value уже является DATE, поэтому удалите TO_DATE в операторе слияния.

ОБНОВЛЕНО Ответ

Похоже на выполнениеНемедленно передаст даты как varchar2, так что, возможно, было бы лучше явно указать формат даты.

plsql_block := 
'merge into MOVEMENTS m 
using (select :id as movement_id, '||q'"to_date(:dt,'YYYYMMDDHH24MI')"'||' as movement_date from dual) s 
   on (m.MOVEMENT_ID = s.movement_id and m.MOVEMENT_DATE = s.movement_date) 
   when matched then update set ' ||'colname'||q'" = to_date('"'||to_char(sysdate,'YYYYMMDDHH24MI')||q'"','YYYYMMDDHH24MI')
   when not matched then insert (MOVEMENT_ID, MOVEMENT_DATE,MOVEMENT_ETD) 
   (:id,:dt,to_date(:value1,'YYYYMMDDHH24MI'))"' from dual;

execute immediate plsql_block USING (......   ,to_char(p_mvt_date,'YYYYMMDDHH24MI'),to_char(p_schedule_value,'YYYYMMDDHH24MI'));

Тогда выполняемый оператор будет выглядеть примерно так ...

"merge into MOVEMENTS m 
using (select :id as movement_id, to_date(:dt,'YYYYMMDDHH24MI') as movement_date from dual) s 
   on (m.MOVEMENT_ID = s.movement_id and m.MOVEMENT_DATE = s.movement_date) 
   when matched then update set colname = to_date('201903151837','YYYYMMDDHH24MI')
   when not matched then insert (MOVEMENT_ID, MOVEMENT_DATE,MOVEMENT_ETD) 
   (:id,:dt,to_date(:value1,'YYYYMMDDHH24MI'))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...