例: C 言語での DB2 ストアドプロシージャのサンプル

次に示すのは、DB2® CLI プリプロセッサ用に C 言語で書かれた DB2 ストアドプロシージャのサンプルです。Advanced RealTime Virtual Fields アクティビティで、キーフィールドが NUMBER1、データフィールドが NUMBER2、TEXT1、TEXT2 のときにオープンイベントを使用するには、ストアドプロシージャがこのフォーマットに従っている必要があります。このサンプルでは、キーフィールドを入力パラメータとして渡し、結果セットにはキーフィールドに続けてデータフィールドを含めるようになっています。入力パラメータのデータ型は、整数型と浮動小数点型の両方で処理されていることに注目してください。

SQL_API_RC SQL_API_FN sf_proc (void *reserved1,
                               void *reserved2,
                               struct sqlda *inout_sqlda,
                               struct sqlca *ca)
{
  /* Declare a local SQLCA */
  EXEC SQL INCLUDE SQLCA;
 
  /* Declare Host Variables */
  EXEC SQL BEGIN DECLARE SECTION;
    char *select_stmt  = "SELECT NUMBER2, TEXT1, TEXT2, NUMBER1 FROM TALBENAME WHERE NUMBER1 = ?";
    long int number1;
  EXEC SQL END DECLARE SECTION;
 
  if (inout_sqlda)
  {
    if ((inout_sqlda->sqlvar[0].sqltype == SQL_TYP_INTEGER) ||
        (inout_sqlda->sqlvar[0].sqltype == SQL_TYP_NINTEGER))
      number1 = *((long int *) (inout_sqlda->sqlvar[0].sqldata));
    else if ((inout_sqlda->sqlvar[0].sqltype == SQL_TYP_FLOAT) ||
             (inout_sqlda->sqlvar[0].sqltype == SQL_TYP_NFLOAT))
      number1 = (long int) *((double *) (inout_sqlda->sqlvar[0].sqldata));
    else
      number1 = 0;

    EXEC SQL WHENEVER SQLERROR GOTO err;
    EXEC SQL PREPARE stmt FROM :select_stmt;
    EXEC SQL DECLARE curs CURSOR FOR stmt;
    EXEC SQL OPEN curs using :number1;
  }
 
err:
  memcpy(ca, &sqlca, sizeof (struct sqlca));
  if (inout_sqlda)
    *(inout_sqlda->sqlvar[0].sqlind) = -128;
 
  return(SQLZ_DISCONNECT_PROC);
}