【问题标题】:Oracle - SP Date Input parameter truncated?Oracle - SP 日期输入参数被截断?
【发布时间】:2019-03-15 11:10:09
【问题描述】:

我有一个将一些输入参数作为日期的程序。 当我尝试执行我的 SP 时,这里是分配给每个参数的值

但是,当我执行时,我收到一条关于 p_schedule_value 参数的日期格式的错误消息。事实上,我们可以看到它没有以指定格式传递日期;相反,它会截断时间并将其作为 yyyy-MMM-dd 传递 您可以在下面的屏幕截图中看到输出中的 dynamic_sql 以及错误消息和 p_schedule_value 的值

为什么我的时间被截断了?它似乎忽略了 TO_DATE 转换 谢谢

编辑: 试图删除 SP 中的 TO_DATE,它编译但时间仍然被截断。只有日期部分插入到我的行中。

【问题讨论】:

    标签: oracle to-date input-parameters


    【解决方案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'))"
    

    【讨论】:

    • 收到不同的错误消息:连接到数据库 localDB。 ORA-00904: "MAY": 无效标识符 ORA-06512: 在 "RTT.INSERT_OR_UPD_MOVEMENTS_SCHEDULE_FIELDS_PROC", 第 18 行 ORA-06512: 在第 14 行合并到 MOVEMENTS m 使用 (select :id as movement_id,:dt as movement_date from dual) s on (m.MOVEMENT_ID = s.movement_id and m.MOVEMENT_DATE = s.movement_date) 当匹配然后更新集合 MOVEMENT_ETD = 01-MAY-19 当不匹配然后插入 (MOVEMENT_ID, MOVEMENT_DATE,MOVEMENT_ETD) 值 (:id,:dt, :value1)
    • 它仍然错过了时间
    • 您是否删除了已经是日期的参数周围的 TO_DATE?你能显示你的程序的当前状态吗?
    • 是的,您可以在我的评论中看到 proc 的输出。
    • 我用 SP 编辑了我的原始帖子。我现在没有错误消息,但时间仍然被截断:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2015-12-12
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多