在“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'))"