Stored procedures 错误5407:存储过程中的DateTime或Interval操作无效
我在这里和网上搜索了这种类型的错误Teradata error“5407 DateTime或Interval的无效操作”,但找不到任何解决方案 简单地说:我在Teradata中有一个简单的存储过程,它有两个输入和一个输出。以下是大讨论: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
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')