【问题标题】:Create table with stored procedure in Teradata在 Teradata 中使用存储过程创建表
【发布时间】:2016-12-11 12:10:43
【问题描述】:

我想创建一个存储过程,我可以在其中将变量传递给下面的 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)

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

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

谢谢

【问题讨论】:

    标签: stored-procedures teradata


    【解决方案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 或临时表可能更有效。

    【讨论】:

    • 谢谢!如果我想创建一个临时表,我只需要在 CREATE 和 TABLE 之间添加“volatile”这个词吗?
    • @MidnightDataGeek: ...并在 PI 后添加 ON COMMIT PRESERVE ROWS
    • 非常感谢您的快速回复,非常感谢。
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 感谢您的回复。当我尝试运行上述任何一个时,我收到以下错误消息:3707: Syntax error, expected something like a 'METHOD' keyword between the 'CREATE' keyword and the 'OR' keyword. Output directed to Answerset window
    • 这是 Oracle 代码,但 Teradata 的 SP 语法基于标准 SQL。
    猜你喜欢
    • 2020-09-25
    • 2021-02-23
    • 2018-05-12
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多