17.00 - 17.05 - FNC_TblAllocCtx - 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
日本語 (日本)

目的

汎用スクラッチパッドを割り振って、ローカル テーブル関数コピーの反復実行間でデータを保持します。

構文

void *
FNC_TblAllocCtx(int  length)
int length
汎用スクラッチパッドに割り振るサイズ(バイト単位)。

最大長は64 KBです。

戻り値

FNC_TblAllocCtxは、ローカル テーブル関数コピーが反復実行間でデータを保持するために使用できる汎用スクラッチパッドのアドレスを戻します。

テーブル関数がすでに汎用スクラッチパッドを割り振っているか、スクラッチパッドを割り振れなかった場合、戻り値はNULLポインタです。

有効な呼び出しモード

このライブラリ関数は、FNC_GetPhaseライブラリ関数によって戻される以下の2つのモードのいずれかの場合に有効です。
  • TBL_MODE_CONST (SELECT文が定数式入力引数のあるテーブル関数を呼び出した場合)
  • TBL_MODE_VARY (SELECT文が派生テーブルからの列を入力引数として使用してテーブル関数を呼び出した場合)

使用上の注意

テーブル関数の後続の呼び出しは、FNC_TblGetCtxを呼び出してスクラッチパッドにアクセスできます。

スクラッチパッドには、スクラッチパッド内の他の構造体を参照するポインタは保管しないでください。戻されるスクラッチパッドのアドレスは、テーブル関数の後続の呼び出しのためのものと同じではないからです。代わりに、スクラッチパッドの現在のアドレスからのオフセットなどの相対アドレッシングを使用してください。

汎用スクラッチパッドは、各AMP vproc上で実行している現在のトランザクションまたはリクエストに関するテーブル関数の各コピーに対してローカルです。後続のトランザクションまたはリクエストのためには保持されません。

テーブル関数の制御コピーは、それが制御コピーであることを示すために、汎用スクラッチパッド内でフラグを設定できます。

スクラッチパッドの最大長が64 KBという制限を回避するには、FNC_mallocを呼び出して、アドレスをスクラッチパッドに保存し、後続の呼び出しで参照できるようにします。FNC_ENDフェーズまたはFNC_ABORTフェーズでFNC_freeを呼び出すことを忘れないでください。そうでない場合、メモリが解放されていないというエラーを受け取ります。

制限

この関数は、テーブル関数内からのみ呼び出すことができます。この関数をスカラー関数、集約関数、UDM、または外部ストアド プロシージャから呼び出すと、トランザクションで例外が発生します。

この関数は一度だけしか呼び出すことができません。

FNC_TblAllocCtxの使用例

typedef struct {
   unsigned short control_flag;
   int            qfd;
       ...
} scratchpad;

scratchpad     *options;
FNC_Phase      Phase;

if (FNC_GetPhase(&Phase) == TBL_MODE_CONST)
{
   switch(Phase)
   {
      case TBL_PRE_INIT:
      {
         if ( FNC_TblControl() )
         {
         options = FNC_TblAllocCtx(sizeof(scratchpad));                
             options->control_flag = 1;
            ...
         }
      }
      ...
   }
}
...