2016-08-05 250 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