2

動的に生成されたSQLをTeradataに送信する方法はありますか?テーブルを非正規化するコードを作成するクエリを作成しました。現在、コードをクライアント(SAS)にプルダウンし、2番目のステップで再送信しています。私はTeradataマクロまたはプロシージャのどちらにも精通していません。そのようなものは機能しますか?

説明のために、次のように定義されたテーブルがあります。

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オブジェクトに保存して、直接実行できるようにする方法があることを願っています。

4

1 に答える 1

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_DATABASE||' AS '''||P_COMMENT||'''';
  CALL dbc.SysExecSQL (:P_SQL_TEXT);

  SET MSG = 'Database '||P_DBNAME||' commented successfully!';
END;
于 2012-12-15T20:53:22.203 に答える