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

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/qwr1571437338192.ditamap
dita:ditavalPath
ja-JP/qwr1571437338192.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

パフォーマンスを向上するために、反復実行間でデータを保持するバイト アレイを、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");
      }
   }
}