错误5407:存储过程中的DateTime或Interval的操作无效

时间:2018-05-03 03:56:44

标签: stored-procedures teradata

我搜索过这种类型的错误Teradata Error" 5407 DateTime或Interval&#34的无效操作;这里和网上但找不到任何解决方案。

简单地说:我在Teradata中有一个简单的sproc,它有2个输入和1个输出。这是sproc:

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;

执行这个简单的sproc时,我收到错误消息:

  

Teradata错误5407 DateTime或Interval

的操作无效

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

任何线索都将不胜感激。

由于

1 个答案:

答案 0 :(得分: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),只需使用带参数的硬编码插页:

INSERT INTO Computer(NTID,CreatedDate)VALUES(:NTIDVar,:CreatedDate);

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