外部ストアド プロシージャからのSQLリクエストに対し、データベースが8バイト アクティビティ カウントを返すようにしたい場合には、親セッションとデフォルト セッションに両方から要求させる必要があります。8バイト アクティビティ カウントは、拡張文ステータス(ESS)応答パーセルで返されます。したがって、ESSパーセルを要求することにより、8バイト アクティビティ カウントを要求することができます。
BTEQ (または多くの他のSQLプロセッサ)から実行する親セッションは、デフォルトでESSパーセルに要求します。さらに外部ストアド プロシージャ コードはESSパーセルを要求し、データベースからのSQL応答でこのパーセルを処理する必要があります。
以下のサンプルコードは、ESSパーセルを要求し、データベースからの応答でESSパーセルを処理するには、外部ストアド プロシージャをどのようにコード化すればよいかを示すものです。関連するコードを太字フォントで示します。
/* Set DBCAREA options. */
static void
set_options(DBCAREA *dbcarea_pt)
{
dbcarea_pt->change_opts = 'Y';
...
dbcarea_pt->data_encryption= 'N';
dbcarea_pt->statement_status = 'E';
dbcarea_pt->create_default_connection = 'Y';
}
/* Fetch parcels and check activity type. */
static Int16
fetch_request(DBCAREA *dbcarea_pt,
int stmnt_no,
char *resultx,
SQL_TEXT *error_message)
{
...
struct CliSuccessType *SuccPcl;
struct CliOkType *OKPcl;
struct CliFailureType *FailPcl;
struct CliStatementStatusType *EssPcl;
...
while (status == OK)
{
DBCHCL(&result, cnta, dbcarea_pt);
count=1;
if (result == REQEXHAUST) status = STOP;
else if (result != EM_OK) status = FAILED;
else
{
switch(dbcarea_pt->fet_parcel_flavor)
{
case PclSUCCESS :
SuccPcl =
(struct CliSuccessType *)dbcarea_pt->fet_data_ptr;
memcpy(acc.acc_c, SuccPcl->ActivityCount, 4);
sprintf(strptr, "[%d]Succ:Act(%d)|\0", stmnt_no,
SuccPcl->ActivityType);
strcat(resultx, strptr);
break;
case PclOK :
OKPcl = (struct CliOkType *)dbcarea_pt->fet_data_ptr;
sprintf(strptr, "[%d]OK:Act(%d)|\0", stmnt_no,
OKPcl->ActivityType);
strcat(resultx, strptr);
break;
case PclSTATEMENTSTATUS:
EssPcl = (struct CliStatementStatusType *)
dbcarea_pt->fet_data_ptr;
sprintf(strptr, "[%d]ESS:Act(%d)|\0", stmnt_no,
EssPcl->ActivityType);
strcat(resultx, strptr);
break;
case PclRECORD :
memcpy(&item, dbcarea_pt->fet_data_ptr, 4);
//cntx = item;
break;
...
}