【问题标题】:Cursor For Volatile Table in TeradataTeradata 中易失性表的光标
【发布时间】: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 表是否存在,但它会被删除,我认为这并不重要这里。谢谢。
  • 大家好,仍然无法找到解决此问题的方法。任何帮助将不胜感激。

标签: cursor teradata 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 表将是这里唯一可行的选择。感谢您的帮助!
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2013-11-29
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多