17.00 - 17.05 - 8バイト アクティビティ カウントの要求 - 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
日本語 (日本)

外部ストアド プロシージャからの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;
   ...
}