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

Create table with stored procedure in 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 将是一个字符串。我不需要显示结果,我只想创建 table。

还有我如何捕获任何错误,例如如果 table 由于某种原因不存在,我仍然希望创建它

谢谢

已编辑...第二个选项也需要立即执行...

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;

由于您没有变量 database/table/column 名称,您只需将现有代码(稍作修改)包装到存储过程中即可:

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