17.00 - 17.05 - 例: 外部ストアド プロシージャからのストアド プロシージャの呼び出し - 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
日本語 (日本)

以下のような定義のストアド プロシージャについて考えてみましょう。

CREATE PROCEDURE addRegion (IN region VARCHAR(64),
                            OUT region_count INTEGER)
  BEGIN
    INSERT INTO regionTable(:region);
    SELECT COUNT(*) INTO :region_count FROM regionTable;
  END;

以下のコードは、外部ストアド プロシージャxsp_getregionからaddRegionストアド プロシージャを呼び出します。

#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>

void xsp_getregion ( VARCHAR_LATIN *region,
                     int           *region_isnull,
                     char          sqlstate[6],
                     SQL_TEXT      extname[129],
                     SQL_TEXT      specific_name[129],
                     SQL_TEXT      error_message[257])
{

  char   tmp_string[64];
  void  *argv[2];
  int    ind[2];
  parm_t dtype[2];
  INTEGER regionCount;   /* OUT argument from addRegion */

  /* Set the return indicator value for the external stored procedure*/
  *region_isnull = 0;

  if (strlen((const char *)region) > 4)
  {
    /* Strip off the first four characters */
    strcpy(tmp_string, (char *)region);
    strcpy((char *)region, &tmp_string[4]);
    /* Set the pointers to the stored procedure arguments */
    argv[0] = region;         /* IN */
    argv[1] = &regionCount;   /* OUT */

    /* Set the indicator for the IN argument */
    ind[0] = 0;

    memset(dtype, 2, sizeof(parm_t)*2);

    /* Data type for the VARCHAR IN argument */
    dtype[0].datatype = VARCHAR_DT;
    dtype[0].direction = IN_PM;
    dtype[0].charset = LATIN_CT;
    dtype[0].size.length = strlen((const char *)region);

    /* Data type for the INTEGER OUT argument */
    dtype[1].datatype = INTEGER_DT;
    dtype[1].direction = OUT_PM;

    FNC_CallSP((SQL_TEXT *)"addRegion", 2, argv, ind, dtype, sqlstate);

    if (strcmp(sqlstate, "00000") != 0)
    {
      strcpy((char *)error_message, "Bad call to addRegion");
      return;
    }
  }
  else
  {
    strcpy(sqlstate, "U0001");
    strcpy((char *)error_message, "Region string too short");
    return;
  }
}

以下に示すのは、xsp_getregion外部ストアド プロシージャをサーバーにインストールするCREATE PROCEDURE文です。

CREATE PROCEDURE GetRegionXSP
  (INOUT region VARCHAR(64))
LANGUAGE C
NO SQL
EXTERNAL NAME 'CS!getregion!xspsrc/getregion.c!F!xsp_getregion'
PARAMETER STYLE TD_GENERAL;