如何在Teradata中执行动态SQL
有没有办法将动态生成的SQL提交给Teradata?我已经编写了一个查询,它将创建代码来反规范化一个表。现在,我正在将代码向下拉到我的客户机(SAS)上,并在第二步中重新提交它。我不熟悉Teradata宏或过程;你喜欢那样的工作吗 为了举例说明,我有一个如下定义的表:如何在Teradata中执行动态SQL,sql,teradata,Sql,Teradata,有没有办法将动态生成的SQL提交给Teradata?我已经编写了一个查询,它将创建代码来反规范化一个表。现在,我正在将代码向下拉到我的客户机(SAS)上,并在第二步中重新提交它。我不熟悉Teradata宏或过程;你喜欢那样的工作吗 为了举例说明,我有一个如下定义的表: create multiset table MYTABLE ( RECID integer generated always as identity ( start with 1
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
),用于监视另一个表中电子邮件日期的更改。以下查询返回我可以运行以创建非规范化视图的代码:
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;
我以前从未使用过存储过程。你能分享一个简单的例子,创建和使用它吗?我可以使用这些文档,但我不确定在哪里可以找到。我添加了一个示例,可以帮助您开始。如果您还有其他问题,请告诉我。我认为示例中的P_DBNAME应该是P_数据库。