在teradata存储过程中执行Dynamic DDL语句?

时间:2016-02-04 14:46:03

标签: stored-procedures teradata

如何在TERADATA中执行动态DDL语句?

CREATE PROCEDURE DROP_INDEXES(IN indexs varchar(1000),IN p_database VARCHAR  (8000),IN p_table varchar(8000))
BEGIN
    DECLARE L_SQL VARCHAR(400);
    SET L_SQL= 'DROP INDEX '||trim(indexs)||' ON '||trim(db_name)|| '.'|| trim(tablename); 
    EXECUTE IMMEDIATE L_SQL;        
END ;

我需要从父过程调用这个child_procedure(DROP_INDEXES),但是在执行parent_procedure期间,执行此过程后

 CALL DROP_INDEXES(indexs,db_name,tablename); 

自动退出parent_procedure,下一个语句没有从parent_procedure执行。

这是我得到的错误:

Executed as Single statement.  Failed [3722 : HY000] SP_DROP_INDEXES:
Only a COMMIT WORK or null statement is legal after a DDL Statement. 
Elapsed time = 00:00:00.326 

请帮我解决我的问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

在Teradata中,每个DDL必须单独提交。您的会话在ANSO模式下运行,因此您需要将;COMMIT;添加到SQL字符串。

这应该有效:

SET L_SQL= 'DROP INDEX '||trim(indexs)||' ON '||trim(db_name)|| '.'|| trim(table name) || ';COMMIT;'

答案 1 :(得分:0)

尝试不同的语法:

REPLACE PROCEDURE DROP_INDEXES(IN indexs varchar(1000), IN p_database    VARCHAR  (8000),IN p_table varchar(8000))
BEGIN
    DECLARE L_SQL VARCHAR(400);
    SET L_SQL= 'DROP INDEX '||trim(indexs)||' ON '||trim(p_database)|| '.'|| trim(p_table); 
    --EXECUTE IMMEDIATE L_SQL;        
    CALL DBC.SysExecSQL( L_SQL );
END ;

REPLACE PROCEDURE PROC_TEST1 (IN db_name varchar(30),IN tablename varchar(30),IN indexs varchar(30))
BEGIN
  CALL DROP_INDEXES(indexs,db_name,tablename); 
  insert into test2 (charcol) select user; 
END;

call proc_test1(DATABASE,'test2','idx_test2');