【问题标题】:How to execute dynamic SQL in Teradata如何在 Teradata 中执行动态 SQL
【发布时间】:2012-12-03 10:33:15
【问题描述】:

有没有办法将动态生成的 SQL 提交给 Teradata?我编写了一个查询,该查询将创建代码以对表进行非规范化。现在,我将代码拉到我的客户 (SAS) 并在第二步中重新提交。我对 Teradata 宏或程序都不熟悉;这样的东西有用吗?

为了说明,我有一个这样定义的表:

create multiset table MYTABLE
    (  RECID  integer generated always as identity
              ( start with 1
               increment by 1
               minvalue -2147483647
               maxvalue 2147483647
               no cycle )
     , SNAP_DATE  date format 'YYYY/MM/DD'
     , EMAIL_DATE date format 'YYYY/MM/DD'
     , FREQ integer
    )
unique primary index ( RECID  )

该表每天都会填充 (SNAP_DATE),用于监控另一个表中 email_date 的更改。以下查询返回我可以运行以创建非规范化视图的代码:

select RUN_THIS
from (
    select RUN_THIS, RN
    from (
        select 'select EMAIL_DATE ' (varchar(100)) as RUN_THIS
              , 0 (int) as RN
          ) x

    union all
    select ', sum( case when SNAP_DATE = date '''
             || (SNAP_DATE (format 'yyyy-mm-dd') (char(10)) )
             || ''' then FREQ else 0 end ) as D'
             || (SNAP_DATE (format 'yyyymmdd') (char(8)) ) as RUN_THIS
          , row_number() over ( partition by 1 order by SNAP_DATE ) as RN
    from ( select distinct SNAP_DATE 
           from MYTABLE 
           where SNAP_DATE > current_date - 30) t1

    union all
    select RUN_THIS, RN
    from (
        select 'from MYTABLE group by 1 order by 1;' as RUN_THIS
                , 10000 as RN
          ) y
    ) t
order by RN

我将上述查询的结果导出到客户端上的文件中,然后转身将该文件提交回 Teradata。我希望有某种方法可以将这个完整的定义存储在某个 Teradata 对象中,以便可以直接执行。

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    您可能会发现使用DBC.SysExecSQL 命令将其放入存储过程中会成功。

    以下是 Teradata 中存储过程的过度简化示例。显然,在生产中需要定义一个错误处理程序来解决诸如无效数据库对象之类的问题。此外,您可以将SQLSTATE 作为参数返回,以测试存储过程是否成功完成。

    CREATE PROCEDURE SYSDBA.CommentDatabase
    (
      IN P_Database VARCHAR(30),
      IN P_Comment VARCHAR(255), 
      OUT MSG
    )
    MAIN:  --Label
    BEGIN
    
      DECLARE  P_SQL_TEXT     VARCHAR(4000);
    
      SET P_SQL_TEXT='COMMENT ON DATABASE '||P_DATABASE||' AS '''||P_COMMENT||'''';
      CALL dbc.SysExecSQL (:P_SQL_TEXT);
    
      SET MSG = 'Database '||P_DBNAME||' commented successfully!';
    END;
    

    【讨论】:

    • 我以前从未使用过存储过程。你能分享一个简单的例子,既可以创建一个也可以使用它?我可以使用文档,但我不确定在哪里查看。
    • 我添加了一个可以帮助您入门的示例。如果您还有其他问题,请告诉我。
    • P_DBNAME 在示例中应该是 P_Database,我认为。
    猜你喜欢
    • 2020-06-17
    • 2017-06-11
    • 2016-05-14
    • 2020-05-27
    • 2010-10-24
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多