【问题标题】:Error 5407: Invalid operation for DateTime or Interval inside stored procedure错误 5407:存储过程中的 DateTime 或 Interval 操作无效
【发布时间】:2018-10-13 06:37:14
【问题描述】:

我已在此处和在线搜索过此类错误 Teradata 错误“5407 日期时间或间隔的无效操作”,但找不到任何解决方案。

简单地说:我在 Teradata 中有一个简单的存储过程,它有 2 个输入和一个输出。这是存储过程:

Replace PROCEDURE SP.CompUserReturnID (
   IN NTIDVar varchar(50),
   IN CreatedDate TIMESTAMP(6),
   OUT ReturnRes integer
)
BEGIN
    DECLARE res varchar(1000);

    DECLARE RetCompID integer;
    DECLARE ReplaceNTIDVAR varchar(50);

    -- In some cases, the NTIDVar contains the single quote (').  Example:   John'O.Smith@company.com
    -- so we need to replace the single quote
    set ReplaceNTIDVAR = oreplace(NTIDVar,'''','''''');

    set res = 'INSERT INTO tables.Computer (NTID, CreatedDate) VALUES (''' || ReplaceNTIDVAR || ''',' || CreatedDate ||') ';
    EXECUTE IMMEDIATE res;

    -- Do something else
    set ReturnRes = res;

    end;

执行这个简单的存储过程时,我收到错误消息:

Teradata 错误 5407 DateTime 或 Interval 的无效操作

CreatedDate 列在 TD 表中定义为 TimeStamp(6)。

任何线索将不胜感激。

谢谢

【问题讨论】:

    标签: stored-procedures teradata


    【解决方案1】:

    错误是由这部分引起的,|| CreatedDate ||。连接需要字符串操作数,但CreatedDate 是时间戳,时间和时间戳没有自动类型转换。

    当您添加显式|| CAST(CreatedDate AS VarChar(26)|| 时,您会收到另一个错误,因为您传递给EXECUTE IMMEDIATE 的字符串必须是有效的语法,但您尝试执行:

    INSERT INTO tables.Computer (NTID, CreatedDate) VALUES ('bla',2018-05-03 12:25:41.65000) 
    

    所以你需要引用时间戳(最好使用时间戳文字):

    SET res = 'INSERT INTO Computer (NTID, CreatedDate) VALUES (''' || ReplaceNTIDVAR 
              || ''', TIMESTAMP ''' || Cast( CreatedDate AS VARCHAR(25))  ||''') ';
    

    最终产生有效的语法:

    INSERT INTO Computer (NTID, CreatedDate) VALUES ('bla', TIMESTAMP '2018-05-03 12:27:34.99000') 
    

    但是,动态 SQL 没有理由(容易出现SQL Injection),只需使用带参数的硬编码插入:

    插入计算机(NTID,CreatedDate)值(:NTIDVar,:CreatedDate);

    当然,你最后的SET ReturnRes = res; 也会失败,因为ReturnRes 是一个INT。

    【讨论】:

    • 很好的解释。
    猜你喜欢
    • 2017-05-10
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多