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

Stored procedures 错误5407:存储过程中的DateTime或Interval操作无效,stored-procedures,teradata,Stored Procedures,Teradata,我在这里和网上搜索了这种类型的错误Teradata error“5407 DateTime或Interval的无效操作”,但找不到任何解决方案 简单地说:我在Teradata中有一个简单的存储过程,它有两个输入和一个输出。以下是大讨论: Replace PROCEDURE SP.CompUserReturnID ( IN NTIDVar varchar(50), IN CreatedDate TIMESTAMP(6), OUT ReturnRes integer ) BEGIN

我在这里和网上搜索了这种类型的错误Teradata error“5407 DateTime或Interval的无效操作”,但找不到任何解决方案

简单地说:我在Teradata中有一个简单的存储过程,它有两个输入和一个输出。以下是大讨论:

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选项卡中定义为时间戳(6)

任何线索都将不胜感激


谢谢

此错误是由此部分引起的,
| | CreatedDate |
。串联需要字符串操作数,但
CreatedDate
是一个时间戳,并且没有时间和时间戳的自动类型转换

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

INSERT INTO tables.Computer (NTID, CreatedDate) VALUES ('bla',2018-05-03 12:25:41.65000) 
因此,您需要引用时间戳(最好使用时间戳文字):

这最终会产生有效的语法:

INSERT INTO Computer (NTID, CreatedDate) VALUES ('bla', TIMESTAMP '2018-05-03 12:27:34.99000') 
但是,没有理由使用动态SQL(这很容易发生),只需使用带有参数的硬编码插入:

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


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

很好的解释。
INSERT INTO Computer (NTID, CreatedDate) VALUES ('bla', TIMESTAMP '2018-05-03 12:27:34.99000')