目的
汎用スクラッチパッドを割り振って、ローカル テーブル関数コピーの反復実行間でデータを保持します。
構文
void *
FNC_TblAllocCtx(int length)
- int length
- 汎用スクラッチパッドに割り振るサイズ(バイト単位)。
戻り値
FNC_TblAllocCtxは、ローカル テーブル関数コピーが反復実行間でデータを保持するために使用できる汎用スクラッチパッドのアドレスを戻します。
テーブル関数がすでに汎用スクラッチパッドを割り振っているか、スクラッチパッドを割り振れなかった場合、戻り値はNULLポインタです。
有効な呼び出しモード
- 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;
...
}
}
...
}
}
...