2012-12-15 138 views
2

有什麼辦法可以將動態生成的SQL提交給Teradata?我寫了一個查詢,它將創建代碼以使表格非規範化。現在,我將代碼下載到我的客戶端(SAS)並在第二步中重新提交。我不熟悉Teradata宏或程序;會有那樣的工作嗎?如何在Teradata中執行動態SQL

爲了說明,我有這樣定義的表:

create multiset table MYTABLE 
    ( RECID integer generated always as identity 
       (start with 1 
       increment by 1 
       minvalue -2147483647 
       maxvalue 2147483647 
       no cycle) 
    , SNAP_DATE date format 'YYYY/MM/DD' 
    , EMAIL_DATE date format 'YYYY/MM/DD' 
    , FREQ integer 
    ) 
unique primary index (RECID ) 

該表被填充每天(SNAP_DATE)和用於監測在另一個表改變爲email_date。下面的查詢返回,我可以運行創造我非規格化視圖代碼:

select RUN_THIS 
from (
    select RUN_THIS, RN 
    from (
     select 'select EMAIL_DATE ' (varchar(100)) as RUN_THIS 
       , 0 (int) as RN 
     ) x 

    union all 
    select ', sum(case when SNAP_DATE = date ''' 
      || (SNAP_DATE (format 'yyyy-mm-dd') (char(10))) 
      || ''' then FREQ else 0 end) as D' 
      || (SNAP_DATE (format 'yyyymmdd') (char(8))) as RUN_THIS 
      , row_number() over (partition by 1 order by SNAP_DATE) as RN 
    from (select distinct SNAP_DATE 
      from MYTABLE 
      where SNAP_DATE > current_date - 30) t1 

    union all 
    select RUN_THIS, RN 
    from (
     select 'from MYTABLE group by 1 order by 1;' as RUN_THIS 
       , 10000 as RN 
     ) y 
    ) t 
order by RN 

我上面的查詢結果導出到我的客戶端上的一個文件,然後轉身和提交文件回到Teradata的。我希望有一些方法可以將這個完整的定義存儲在某個Teradata對象中,以便它可以直接執行。

回答

2

您可能會發現使用DBC.SysExecSQL命令將其存儲在存儲過程中。

以下是Teradata中存儲過程的一個過分簡化的示例。顯然,在生產過程中,需要定義一個錯誤處理程序來處理無效的數據庫對象。此外,您可以返回SQLSTATE作爲參數來測試存儲過程是否成功完成。

CREATE PROCEDURE SYSDBA.CommentDatabase 
(
    IN P_Database VARCHAR(30), 
    IN P_Comment VARCHAR(255), 
    OUT MSG 
) 
MAIN: --Label 
BEGIN 

    DECLARE P_SQL_TEXT  VARCHAR(4000); 

    SET P_SQL_TEXT='COMMENT ON DATABASE '||P_DBNAME||' AS '''||P_COMMENT||''''; 
    CALL dbc.SysExecSQL (:P_SQL_TEXT); 

    SET MSG = 'Database '||P_DBNAME||' commented successfully!'; 
END; 
+0

我從來沒有使用過存儲過程。你能分享一個簡單的例子,既可以創建一個並使用它?我可以使用文檔,但我不確定在哪裏尋找。 – BellevueBob

+0

我已經添加了一個可以讓你開始的例子。如果您還有其他問題,請告訴我。 –