17.10 - 例: 2つのVantageシステムの間でデータを受け渡すテーブル関数の使用 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 構文規則および例

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1144-171K-JPN
Language
日本語 (日本)

二重のアクティブなVantageシステムを実行している場合、あるいは開発またはテスト用のマシンに第2のVantageシステムがある場合など、2つのプラットフォーム間でデータの受け渡しが必要になることが考えられます。例えば、一方のシステムからディクショナリ テーブルの問合わせを行ない、それらのテーブルをもう一方のシステムと相関できると便利な場合があります。この例では、これを行なう方法を説明します。

次のSELECTリクエストは、tdatという名前のテーブル関数を使用しますが、この関数はリモートTeradataシステムに対して問合わせを実行し、その後で要求元のシステムに応答セットを返します。この例では、UDFはもう一方のシステムのディクショナリ テーブルに含まれているすべてのデータベース名を返します。

    SELECT * 
    FROM table(rdg.tdat(2,1,'adw1/rdg,rdg', 'SELECT databasename FROM                dbc.databasesV')); 

このSELECTリクエストはテーブル関数の固定入力引数として要求元システムから渡され、ターゲット システムで(そのシステムへのログオン ストリングのように)実行されます。

テーブル関数を作成するDDLは次のとおりです。

    CREATE FUNCTION rdg.tdat 
        (rowc       INTEGER, 
         InLineNum  INTEGER, 
         logonstr   VARCHAR(50)   CHARACTER SET LATIN, 
         sqlRqst    VARCHAR(512)  CHARACTER SET LATIN) 
     RETURNS TABLE (
         ampId      INTEGER, 
         cnt        INTEGER, 
         OutLineNum INTEGER, 
         str1       VARCHAR(256)  CHARACTER SET LATIN, 
           .
           .
           .
         str20      VARCHAR(256)  CHARACTER SET LATIN) 
    SPECIFIC tdat 
    LANGUAGE C 
    NO SQL  
    PARAMETER STYLE SQL 
    NOT DETERMINISTIC 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'SS:tdat:/home/rdg/tdat/Tdat.c:SL:cliv2';

2つのTeradataシステムにまたがる1つのビューを作成することにより、両方のプラットフォームでディクショナリの内容を比較したり、テーブル領域や権限などの詳細データを比較したりすることができます。

次のビューは、各システムのDBC.Tablesビューに現われる行を比較します。

    CREATE VIEW allTables AS
      SELECT 'Local System' AS system, databasename, tablename, version,
             tablekind, protectionType, JournalFlag, CreatorName,              requesttext(VARCHAR(100))
      FROM DBC.tables
    UNION
      SELECT 'Remote System', str1 (CHAR(30)), str2 (CHAR(30)), 
             str3 (INTEGER), str4 (CHAR(1)), str5 (CHAR(1)), 
             str6 (CHAR(2)), str7 (CHAR(30)), str8 (VARCHAR(100))
      FROM table(rdg.tdat(2,1,'adw1/rdg,rdg', 'SELECT databasename,                  tablename, version, tablekind, protectionType,
                 JournalFlag, CreatorName, requesttext(VARCHAR(100))
                 FROM DBC.tables')) T;

リモートで実行されるSELECT問合わせから返されるデータのサンプリングをテーブル名で並べ替えると(クロス比較を簡単にするため)、次のようになります。

    System         DatabaseName  TableName     Version  TableKind
    -------------- ------------  ------------  -------  ---------
    Remote System  test          a             1        T
    Local System   DBC           AccessRights  1        T
    Remote System  DBC           AccessRights  1        T
    Remote System  DBC           AllSpaceV     1        V
    Local System   DBC           AllSpaceV     1        V
    Local System   rdg           allamp        1        T
    Remote System  test          allamp        1        T