2016-08-05 30 views
0

我想创建一个存储过程,我可以将变量传递给下面的WHERE子句。使用Teradata中的存储过程创建表

DROP TABLE fan0ia_mstr.Store_List; 

CREATE TABLE fan0ia_mstr.Store_List AS(

SELECT 
a11.ANA_Code, 
a11.Premise_Name_Full, 
a11.Store_Code, 
a11.Estates_Segment, 
a12.Post_Code 
FROM Store_Dimension_Hierarchy a11 
JOIN Location a12 
ON a11.ANA_Code = a12.ANA_Code 
WHERE a11.Area_Desc = 'VARIABLE') WITH DATA 
PRIMARY INDEX (ANA_Code) 

VARIABLE将是一个字符串。我不需要显示结果,我只想创建表格。

我该如何捕获任何错误如果表中没有出于某种原因存在我还是希望它创建

感谢

回答

1

正如你没有,你只需要来包装现有的代码(略有修改)到一个存储Pro变量数据库/表/列名退出:

replace procedure myproc(IN variable varchar(100)) 
begin 

    BEGIN 
     -- simply try dropping the table and ignore the "table doesn't exist error" 
     DECLARE exit HANDLER FOR SQLEXCEPTION 
     BEGIN -- 3807 = table doesn't exist 
     IF SQLCODE <> 3807 THEN RESIGNAL; END IF; 
     END; 

     DROP TABLE fan0ia_mstr.Store_List; 
    END; 


    CREATE TABLE fan0ia_mstr.Store_List AS(

    SELECT 
    a11.ANA_Code, 
    a11.Premise_Name_Full, 
    a11.Store_Code, 
    a11.Estates_Segment, 
    a12.Post_Code 
    FROM Store_Dimension_Hierarchy a11 
    JOIN Location a12 
    ON a11.ANA_Code = a12.ANA_Code 
    WHERE a11.Area_Desc = :variable) WITH DATA 
    PRIMARY INDEX (ANA_Code); 

end; 

当然,DELETE/INSERT或临时表可能更有效。

+0

谢谢!如果我想创建一个临时表,我只需要在CREATE和TABLE之间添加'volatile'这个词? – MidnightDataGeek

+0

@MidnightDataGeek:...并在PI后添加“ON COMMIT PRESERVE ROWS”。 – dnoeth

+0

非常感谢您的快速回复,非常感谢。 – MidnightDataGeek

0

编辑...第二个选项需要执行即时太...

CREATE PROCEDURE PROCEDURE1(
    V_AREA_DESC IN VARCHAR2) 
AS 
BEGIN 
    BEGIN 
    EXECUTE IMMEDIATE 'DROP TABLE fan0ia_mstr.Store_List'; 
    EXCEPTION 
    WHEN OTHERS THEN 
    NULL; 
    END; 

    EXECUTE IMMEDIATE 'CREATE TABLE fan0ia_mstr.Store_List AS 
    (SELECT a11.ANA_Code, 
     a11.Premise_Name_Full, 
     a11.Store_Code, 
     a11.Estates_Segment, 
     a12.Post_Code 
     FROM Store_Dimension_Hierarchy a11 
     JOIN Location a12 
     ON a11.ANA_Code  = a12.ANA_Code 
     WHERE a11.Area_Desc = ''' || v_area_desc || ''' 
    ) WITH DATA PRIMARY INDEX (ANA_Code)'; 

END PROCEDURE1; 

但你可以避免跌落/截断与创建/插入

CREATE PROCEDURE PROCEDURE1(
    V_AREA_DESC IN VARCHAR2) 
AS 
BEGIN 
    execute immediate 'truncate TABLE fan0ia_mstr.Store_List'; 

    insert into fan0ia_mstr.Store_List (SELECT a11.ANA_Code, 
     a11.Premise_Name_Full, 
     a11.Store_Code, 
     a11.Estates_Segment, 
     a12.Post_Code 
     FROM Store_Dimension_Hierarchy a11 
     JOIN Location a12 
     ON a11.ANA_Code  = a12.ANA_Code 
     WHERE a11.Area_Desc = v_area_desc 
    ); 

    commit; 

END PROCEDURE1; 
+0

感谢您的回复。当我尝试运行上述任一操作时,出现以下错误消息: '3707:语法错误,预期类似'CREATE'关键字和'OR'关键字之间的'METHOD'关键字。 输出指向Answerset窗口# – MidnightDataGeek

+0

这是Oracle代码,但Teradata的SP语法基于标准SQL。 – dnoeth