Teradata 中易失性表的光标
Posted
技术标签:
【中文标题】Teradata 中易失性表的光标【英文标题】:Cursor For Volatile Table in Teradata 【发布时间】:2019-01-14 18:05:22 【问题描述】:我有一个在过程中创建的易失性表(例如,vtTempTableForPI
)。一旦创建了易失性表,我将在其中插入行。
一旦我在 volatile 表中有记录,我需要从这个 volatile 表 (vtTempTableForPI
) 中取出 MAX(ModifiedDatetime)
到一个局部变量中。但是,我找不到这样做的方法。
这是我的过程中针对某些上下文的一段代码:
SELECT MAX(ModifiedDatetime)
FROM vtTempTableForPI
INTO lvMaxUpdateDateTime
WHERE Template = 'Schedule_Stream'
;
然后我想用这个局部变量插入另一个易失性表,如下所示:
SET lvQuery = '
INSERT INTO vtScheduleVersionUpdatedTime
SELECT
''Schedule_Stream''
, ''' || CAST(lvMaxUpdateDateTime AS VARCHAR(19)) || '''
';
EXECUTE IMMEDIATE lvQuery;
我不能在 volatile 表上使用这个游标,因为当我们编译过程时它的定义不会出现在 DBC 中,所以它会出错。如果我尝试使用动态查询来避免此错误,则会遇到另一个错误,如下所示:
SET lvMaxModifiedDateQuery = '
SELECT MAX(ModifiedDatetime)
FROM vtTempTableForPI
WHERE Template = ''Schedule_Tank''
';
PREPARE stMaxModifiedDateQuery03 FROM lvMaxModifiedDateQuery;
OPEN crGetMaxModifiedDate03;
FETCH crGetMaxModifiedDate03 INTO lvMaxUpdateDateTime;
--CLOSE crGetMaxModifiedDate;
SET lvQuery = '
INSERT INTO vtScheduleVersionUpdatedTime
SELECT
''Schedule_Tank''
, ''' || CASt(lvMaxUpdateDateTime AS VARCHAR(19)) || '''
';
EXECUTE IMMEDIATE lvQuery;
以下是我得到的错误:
Failure occured while Creating Dynamic Query
SQL State:T7688,
SQL Code:7688,
SQL SESSION: 252898254,
Execution Start Time:2019-01-13 21:44:44,
Execution End Time:2019-01-13 21:44:54,
ERROR Message: Error occurred generating Evl code for dynamic fetch.
需要帮助!
【问题讨论】:
您能否显示您尝试使用第一个选择时收到的错误消息? 我收到以下错误:SPL1027:E(L457), Missing/Invalid SQL statement'E(3807):Object 'vtTempTableForPI' does not exist.'.
虽然我确实有一段代码可以在程序运行之前检查 volatile 表是否存在,但它会被删除,我认为这并不重要这里。谢谢。
大家好,仍然无法找到解决此问题的方法。任何帮助将不胜感激。
【参考方案1】:
您的 Teradata 版本是什么?这对我来说很好用:
REPLACE PROCEDURE SP_test(
IN v_CALC_BASIS VARCHAR(100))
BEGIN
DECLARE lvMaxUpdateDateTime INT;
DECLARE v_LogStmt VARCHAR(5000);
SELECT Max(ModifiedDatetime)
FROM vtTempTableForPI
INTO lvMaxUpdateDateTime
WHERE Template = 'Schedule_Stream'
;
END;
CALL SP_test ('bla');
CALL Failed. [3807] SP_TEST:Object 'vtTempTableForPI' does not exist.
要么在编译前创建易失性表,要么直接切换到全局临时表(推荐)。
【讨论】:
谢谢@dnoeth。我正在使用 Teradata 15.10。我认为在编译之前创建 volatile 表将是这里唯一可行的选择。感谢您的帮助!以上是关于Teradata 中易失性表的光标的主要内容,如果未能解决你的问题,请参考以下文章
Teradata 锁定表以供读取,同时通过具有访问权限的视图访问表
使用teradata模块从python连接到Teradata导致'WSA E TimedOut'
Teradata 使用笔记基于Vwmare虚拟机的Teradata安装部署(完整版)
sql teradata 过滤日期 - 数据库版本 Teradata 15.10.06.02 和提供程序版本 Teradata.Net 15.11.0.0