Oracle - Параметр ввода даты SP усечен?

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

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

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

EDIT: попытался удалить TO_DATE в SP, он компилируется, но время все еще усекается. В мою строку вставляется только часть даты. введите здесь описание изображения


person Mélanie    schedule 15.03.2019    source источник


Ответы (1)


В процедуре "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'))"
person F.Madsen    schedule 15.03.2019
comment
Получение другого сообщения об ошибке: Подключение к базе данных localDB. ORA-00904: МОЖЕТ: недействительный идентификатор ORA-06512: в RTT.INSERT_OR_UPD_MOVEMENTS_SCHEDULE_FIELDS_PROC, строка 18 ORA-06512: в строке 14 объединиться в MOVEMENTS m, используя (выбрать :id как traffic_id,:dt как traffic_date из двойного) s on (m. MOVEMENT_ID = s.movement_id и m.MOVEMENT_DATE = s.movement_date) при совпадении, затем обновите набор MOVEMENT_ETD = 01-MAY-19, если не соответствует, затем вставьте (MOVEMENT_ID, MOVEMENT_DATE,MOVEMENT_ETD) значения (:id,:dt,:value1) - person Mélanie; 15.03.2019
comment
и все еще не хватает времени - person Mélanie; 15.03.2019
comment
Вы удалили TO_DATE вокруг аргументов, которые уже являются датами? Можете ли вы показать текущее состояние вашей процедуры? - person F.Madsen; 15.03.2019
comment
Да, вы можете увидеть результат процедуры в моем комментарии. - person Mélanie; 15.03.2019
comment
Я отредактировал свой оригинальный пост с SP. Теперь у меня нет сообщения об ошибке, но время все еще усекается :( - person Mélanie; 15.03.2019
comment
Не так просто :), похоже, что это может быть немедленное выполнение, которое выполняет неявное приведение от даты и обратно, а затем это зависит от вашей настройки NLS_DATE_FORMAT. Но тогда может быть проще контролировать формат на всем протяжении. Я отредактирую свой ответ. - person F.Madsen; 15.03.2019
comment
Спасибо за это! Итак, теперь я действительно вижу, как оператор выполняется со временем, так что это здорово :) Но когда я открываю свою таблицу, чтобы посмотреть на свою строку, я вижу только дату в столбце. Вы знаете, почему? - person Mélanie; 19.03.2019
comment
ЕСЛИ у вас есть DATE Columbia, она содержит дату и время. Обычно в вашем инструменте есть настройка формата даты i, но вы также можете указать формат... Выберите to_char(col, 'гггг-мм-дд чч24:ми').... - person F.Madsen; 24.03.2019