FNC_TblAllocCtrlCtx - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/rin1593638965306.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1147
Product Category
Software
Teradata Vantage

制御スクラッチパッドを割り振って、テーブル関数の制御コピーから他のAMP vproc上で実行するすべてのコピーにデータを伝播します。

FNC_TblAllocCtrlCtxは、テーブル関数の制御コピーがデータをテーブル関数の他のすべてのコピーにデータを伝播するために使用できる制御スクラッチパッドのアドレスを戻します。

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

このライブラリ関数は、FNC_GetPhaseの戻り値がTBL_MODE_CONSTである場合に使用します。これはSELECT文が定数式入力引数のあるテーブル関数を呼び出したことを示します。例えば、次のようになります。

SELECT *
FROM TABLE (table_function_1('STRING_CONSTANT'))
AS table_1;

構文規則

void *
FNC_TblAllocCtrlCtx(int  length)

構文要素

length
制御スクラッチパッドに割り振るサイズ(バイト単位)。
最大長は64 KBです。

使用上の注意

制御スクラッチパッドを使用して、テーブル関数が実行しているはずの処理や、実行しないままにしている処理を追跡します。

この関数の呼び出しは以下の場合に有効です。
  • テーブル関数がFNC_GetPhaseを呼び出し、処理フェーズ用のTBL_PRE_INITの値を取得する場合
  • テーブル関数のこのコピーがFNC_TblControlを呼び出してテーブル関数の制御コピーとして自身を設定する場合

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

テーブル関数の制御コピーがTBL_PRE_INIT処理フェーズを完了した後に、テーブル関数のすべてのコピー(制御コピーを含む)は、テーブル関数の制御コピーがTBL_PRE_INITフェーズ以外のいずれかの処理フェーズでFNC_TblGetCtrlCtxを呼び出して制御スクラッチパッドに保管したデータにアクセスできます。制御スクラッチパッドに加えられる後続の変更はローカルなものと見なされ、ローカル テーブル関数コピーの次回の反復実行のためにスクラッチパッド内に保持されます。

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

この関数の呼び出しは、テーブル関数がFNC_GetPhaseを呼び出して以下の戻り値を取得した場合にのみ有効です。
  • モードとしてTBL_MODE_CONST
  • 処理フェーズとしてTBL_PRE_INIT

FNC_TblAllocCtrlCtxの使用例

typedef struct {
   unsigned short cntrl_fnc_AMP
   int            qfd;
   ...
} ctrl_ctx;

ctrl_ctx     *options;
AMP_Info_t   *LocalConfig;
FNC_Phase    Phase;

if (FNC_GetPhase(&Phase) == TBL_MODE_CONST)
{
   switch(Phase)
   {
      case TBL_PRE_INIT:
      {
         LocalConfig = FNC_AMPInfo();
         if ( FNC_TblControl() )
         {
         options = FNC_TblAllocCtrlCtx(sizeof(ctrl_ctx));                
            options->ctrl_fnc_AMP = LocalConfig->AMPId;
            ...
         }
      }
      ...
   }
}
...