在Teradata中使用存储过程创建表

时间:2016-08-05 07:02:39

标签: stored-procedures teradata

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

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将是一个字符串。我不需要显示结果,我只想创建表格。

另外我如何捕获任何错误,例如如果表格由于某种原因不存在,我仍然希望它被创建

感谢

2 个答案:

答案 0 :(得分:1)

由于您没有可变的数据库/表/列名称,您只需将现有代码(略微修改)包装到存储过程中:

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或临时表可能更有效。

答案 1 :(得分: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;

但你可以避免使用truncate / insert

删除/创建
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;