17.00 - 17.05 - 反復実行間でデータを保持するためのバイト アレイの使用 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

パフォーマンスを向上するために、反復実行間でデータを保持するバイト アレイを、JavaのテーブルUDFで使用できます。

コンテキスト オブジェクトの割り当て、設定、および取得を実行するメソッドは、次のとおりです。

  • 戻り値のないTbl.allocCtx(int)。
  • 戻り値のないTbl.setCtxObject(byte[])。
  • 戻り値がbyte[]のgetCtxObject(byte[])。

これらに応じて、コンテキスト オブジェクトを逐次化および非逐次化するメソッドを用意する必要があります。

次の例では、整数値をコンテキスト オブジェクトとして保持するバイト アレイを使用しています。サポート メソッドのbyteArrayToInt(byte [])、およびintToByteArray(int)を、必要に応じて用意します。

import com.teradata.fnc.Tbl;
import java.sql.*;

public class Measure

{
   public static final int byteArrayToInt(byte [] b)
   {
      return (b[0] << 24)
                      + ((b[1] & 0xFF) << 16)
                      + ((b[2] & 0xFF) << 8)
                      + (b[3] & 0xFF);
   }
   public static final byte[] intToByteArray(int value)
   {
      return new byte[] {
                     (byte)(value >>> 24),
                     (byte)(value >>> 16),
                     (byte)(value >>> 8),
                     (byte)value  };
   }

   public static void j_noop_table1_bytearray(double a, double[] c) throws SQLException
   {
      byte[] ctxByteArr = {0, 0, 0, 0}; // scratch pad
      int count;
      try
      {
         int [] phase = new int[1];
         Tbl tbl = new Tbl();
         int mode = tbl.getPhase(phase);
         if (mode!=Tbl.TBL_MODE_VARY) throw new SQLException("Wrong Mode", "U0001");
         switch(phase[0])

         {
            case Tbl.TBL_PRE_INIT:
               tbl.allocCtx(4); // 4-byte integer
               break;

            case Tbl.TBL_INIT:
               count = 1;
               ctxByteArr = intToByteArray(count);
               tbl.setCtxObject(ctxByteArr);
               break;

            case Tbl.TBL_BUILD:
               ctxByteArr = (byte[])tbl.getCtxObject(ctxByteArr);
               count = byteArrayToInt(ctxByteArr);
               if (count == 0) throw new SQLException("no more data", "02000");

               c[0] = a;

               count--;
               ctxByteArr = intToByteArray(count);
               tbl.setCtxObject(ctxByteArr);
               break;

            case Tbl.TBL_FINI:
            case Tbl.TBL_END:
            case Tbl.TBL_ABORT:
            default:
               break;
         }
      } catch (ClassNotFoundException e) {
         throw new SQLException("ClassNotFoundException", "U0002");
      } catch(IOException e){
         throw new SQLException("IOException", "U0003");
      }
   }
}