sql - 如何在 Teradata 中执行动态 SQL

标签 sql teradata

有什么方法可以将动态生成的 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 的更改。以下查询返回我可以运行来创建非规范化 View 的代码:

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 对象中,以便可以直接执行它。

最佳答案

您可能会发现使用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;

关于sql - 如何在 Teradata 中执行动态 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895370/

相关文章:

mysql - SQL 查询 - 未从 Like 语句中获得正确的结果

sql - INSERT INTO 减去 2 个值

sql - 追加两个表 - 联合在 SQL (Teradata) 中不起作用

foreign-keys - 选择 Teradata 主/外键关系

sas - volatile 表和多集 volatile 表有什么区别?

mysql - 使用 LEFT JOIN 在 MySQL 中返回不正确计数的表上的 GROUP BY

mysql - 使用fts+复合索引优化查询

php - 每 x 秒自动刷新一个 Html 表

hadoop - Sqoop 无法从 teradata 获取数据并出现 java.IO 异常

sql - Teradata的 "implicit JOIN"的语法转换规则是什么?