有没有办法向Teradata提交动态生成的sql?我编写了一个查询,它将创建用于对表进行非规范化的代码.现在,我将代码拉到我的客户端(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中存储过程的过度简化示例.显然,在生产中需要定义一个错误处理程序来解决无效数据库对象之类的问题.此外,您可以将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_DBNAME||' AS '''||P_COMMENT||''''; CALL dbc.SysExecsql (:P_sql_TEXT); SET MSG = 'Database '||P_DBNAME||' commented successfully!'; END;