如何在Teradata中执行动态SQL

有什么方法可以将动态生成的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对象中,以便可以直接执行。

回答:

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

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

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;

以上是 如何在Teradata中执行动态SQL 的全部内容, 来源链接: utcz.com/qa/409897.html

回到顶部