INCLUDE SQLDA の宣言

このセクションでは、C および C++、COBOL、ILE COBOL、PL/I、および ILE RPG について、同等の INCLUDE SQLDA 宣言を示します。

C および C++ の場合

C および C++ の場合、INCLUDE SQLDA 宣言は以下と同等です。

図 1. C および C++ の場合の INCLUDE SQLDA 宣言
#ifndef SQLDASIZE
struct sqlda
{
       unsigned char  sqldaid[8];
       long           sqldabc;
       short          sqln;
       short          sqld;
       struct sqlvar
       {
              short          sqltype;
              short          sqllen;
              union {
                unsigned char *sqldata;
                long long sqld_result_set_locator;  };
              union {
                short *sqlind;
                long sqld_row_change;
                long sqld_result_set_rows;   };
              struct sqlname
              {
                     short          length;
                     unsigned char  data[30];
              } sqlname;
       } sqlvar[1];
};

struct sqlvar2
       { struct
                {  long           sqllonglen;
                   char           reserve1[28];
                }  len;
                char *sqldatalen;
                struct sqldistinct_type
                       {  short          length;
                          unsigned char  data[30];
                       } sqldatatype_name;
       };

#define  SQLDASIZE(n) (sizeof(struct sqlda)+(n-1) * sizeof(struct sqlvar))
#endif
/*********************************************************************/
/* Macros for using the sqlvar2 fields.                              */
/*********************************************************************/

/*********************************************************************/
/*   '2' in the 7th byte of sqldaid indicates a doubled number of    */
/*       sqlvar entries.                                             */
/*   '3' in the 7th byte of sqldaid indicates a tripled number of    */
/*       sqlvar entries.                                             */
/*   '4' in the 7th byte of sqldaid indicates a quadrupled number of */
/*       sqlvar entries.                                             */
/*********************************************************************/
#define SQLDOUBLED '2'
#define SQLSINGLED ' '

/*********************************************************************/
/* GETSQLDOUBLED(daptr) returns 1 if the SQLDA pointed to by         */
/* daptr has been doubled, or 0 if it has not been doubled.          */
/*********************************************************************/
#define GETSQLDOUBLED(daptr) (((daptr)->sqldaid[6]==  \
 (char) SQLDOUBLED)  ?                                \
    (1)           :      \
    (0)             )

/*********************************************************************/
/* SETSQLDOUBLED(daptr, SQLDOUBLED) sets the 7th byte of sqldaid     */
/* to '2'.                                                           */
/* SETSQLDOUBLED(daptr, SQLSINGLED) sets the 7th byte of sqldaid     */
/* to be a ' '.                                                      */
/*********************************************************************/
#define SETSQLDOUBLED(daptr, newvalue)                \
  (((daptr)->sqldaid[6] =(newvalue)))

/*********************************************************************/
/* GETSQLDALONGLEN(daptr,n) returns the data length of the nth       */
/* entry in the sqlda pointed to by daptr. Use this only if the      */
/* sqlda was doubled or tripled and the nth SQLVAR entry has a       */
/* LOB datatype.                                                     */
/*********************************************************************/
#define GETSQLDALONGLEN(daptr,n) ((long) (((struct sqlvar2 *) \
&((daptr)->sqlvar[(n) +((daptr)->sqld)])) ->len.sqllonglen))

/*********************************************************************/
/* SETSQLDALONGLEN(daptr,n,len) sets the sqllonglen field of the     */
/* sqlda pointed to by daptr to len for the nth entry. Use this only */
/* if the sqlda was doubled or tripled and the nth SQLVAR entry has  */
/* a LOB datatype.                                                   */
/*********************************************************************/
#define SETSQLDALONGLEN(daptr,n,length) {             \
 struct sqlvar2 *var2ptr;                             \
 var2ptr = (struct sqlvar2 *) &((daptr)->sqlvar[(n)+  \
   ((daptr)->sqld)]);                                 \
 var2ptr->len.sqllonglen = (long) (length);               \
}

/*********************************************************************/
/* SETSQLDALENPTR(daptr,n,ptr) sets a pointer to the data length for */
/* the nth entry in the sqlda pointed to by daptr.                   */
/* Use this only if the sqlda has been doubled or tripled.           */
/*********************************************************************/
#define SETSQLDALENPTR(daptr,n,ptr) {                 \
 struct sqlvar2 *var2ptr;                             \
 var2ptr = (struct sqlvar2 *) &((daptr)->sqlvar[(n)+  \
   ((daptr)->sqld)]);                                 \
 var2ptr->sqldatalen = (char *) ptr;                  \
 }
/*********************************************************************/
/* GETSQLDALENPTR(daptr,n) returns a pointer to the data length for  */
/* the nth entry in the sqlda pointed to by daptr. Unlike the inline */
/* value (union sql8bytelen len), which is 8 bytes, the sqldatalen   */
/* pointer field returns a pointer to a long (4 byte) integer.       */
/* If the SQLDATALEN pointer is zero, a NULL pointer is be returned. */
/*                                                                   */
/* NOTE: Use this only if the sqlda has been doubled or tripled.     */
/*********************************************************************/
#define GETSQLDALENPTR(daptr,n) (                     \
  (((struct sqlvar2 *) &(daptr)->sqlvar[(n) +         \
    (daptr)->sqld])->sqldatalen == NULL) ?            \
   ((long *) NULL ) : ((long *) ((struct sqlvar2 *)   \
  &(daptr)->sqlvar[(n) + (daptr) ->sqld])->sqldatalen))

COBOL と ILE COBOL の場合

COBOL と ILE COBOL の場合、INCLUDE SQLDA 宣言は、以下のステートメントと同等です。

図 2. INCLUDE SQLDA の宣言 (COBOL の場合)
1 SQLDA.
  05 SQLDAID     PIC X(8).
  05 SQLDABC     PIC S9(9) BINARY.
  05 SQLN        PIC S9(4) BINARY.
  05 SQLD        PIC S9(4) BINARY.
  05 SQLVAR OCCURS 0 TO 409 TIMES DEPENDING ON SQLD.
     10 SQLVAR1.
        15 SQLTYPE   PIC S9(4) BINARY.
        15 SQLLEN    PIC S9(4) BINARY.
        15 FILLER  REDEFINES SQLLEN.
           20 SQLPRECISION PIC X.
           20 SQLSCALE     PIC X.
        15 SQLRES    PIC X(12).
        15 SQLDATA   POINTER.
        15 SQL-RESULT-SET-LOCATOR-R REDEFINES SQLDATA.
           20 SQL-RESULT-SET-LOCATOR PIC S9(18) BINARY.
        15 SQLIND   POINTER.
        15 SQL-ROW-CHANGE-SQL-R REDEFINES SQLIND.
           20 SQLD-ROW-CHANGE FIC S9(9) BINARY.
        15 SQL-RESULT-SET-ROWS-R PIC REDEFINES SQLIND.
           20 SQLD-RESULT-SET-ROWS PIC S9(9) BINARY.
        15 SQLNAME.
           49 SQLNAMEL PIC S9(4) BINARY.
           49 SQLNAMEC PIC X(30).
     10 SQLVAR2 REDEFINES SQLVAR1.
        15 SQLVAR2-RESERVED-1 PIC S9(9) BINARY.
        15 SQLLONGLEN REDEFINEDS SQLVAR2-RESERVED-1
                                 PIC S9(9) BINARY.
        15 SQLVAR2-RESERVED-2 PIC X(28).
        15 SQLDATALEN POINTER.
        15 SQLDATATYPE-NAME.
           49 SQLDATATYPE_NAMEL PIC S9(4) BINARY.
           49 SQLDATATYPE_NAMEC PIC X(30).
            

PL/I の場合

PL/I の場合、INCLUDE SQLDA の宣言は、以下のステートメントと同等です。

図 3. INCLUDE SQLDA の宣言 (PL/I の場合)
DCL 1 SQLDA BASED(SQLDAPTR),
      2 SQLDAID     CHAR(8),
      2 SQLDABC     BIN FIXED(31),
      2 SQLN        BIN FIXED,
      2 SQLD        BIN FIXED,
      2 SQLVAR      (99),
        3 SQLTYPE   BIN FIXED,
        3 SQLLEN    BIN FIXED,
        3 SQLRES    CHAR(12),
        3 SQLDATA   PTR,
        3 SQLIND    PTR,
        3 SQLNAME   CHAR(30) VAR,

    1 SQLDA2 BASED(SQLDAPTR),
      2 SQLDAID2    CHAR(8),
      2 SQLDABC2    FIXED(31) BINARY,
      2 SQLN2       FIXED(15) BINARY,
      2 SQLD2       FIXED(15) BINARY,
      2 SQLVAR2     (99),
        3 SQLBIGLEN,
          4 SQLLONGL FIXED(31) BINARY,
          4 SQLRSVDL FIXED(31) BINARY,
        3 SQLDATAL  POINTER,
        3 SQLTNAME  CHAR(30) VAR;

    DECLARE SQLSIZE    FIXED(15) BINARY;
    DECLARE SQLDAPTR   PTR;
    DECLARE SQLDOUBLED CHAR(1)   INITIAL('2') STATIC;
    DECLARE SQLSINGLED CHAR(1)   INITIAL(' ') STATIC;

ILE RPG の場合

ILE RPG の場合、INCLUDE SQLDA の宣言は、以下のステートメントと同等です。

図 4. INCLUDE SQLDA の宣言 (ILE RPG の場合)
D*      SQL DESCRIPTOR AREA
D SQLDA           DS
D  SQLDAID                       8A
D  SQLDABC                      10I 0
D  SQLN                          5I 0
D  SQLD                          5I 0
D  SQL_VAR                      80A   DIM(SQL_NUM)
D                        33     48*
D                        49     64*
D*
D SQLVAR          DS
D  SQLTYPE                       5I 0
D  SQLLEN                        6I 0
D  SQLRES                       12A
D  SQLINFO1                     16A
D   SQLDATA                       *   OVERLAY(SQLINFO1:1)
D   SQL_RESULT_SET_LOCATOR...
D                               20I 0 OVERLAY(SQLINFO1:1)
D  SQLINFO2                     16A
D   SQLIND                        *   OVERLAY(SQLINFO2:1)
D   SQL_ROW_CHANGE...
D                               10I 0 OVERLAY(SQLINFO2:1)
D   SQL_RESULT_SET_ROWS...
D                               10I 0 OVERLAY(SQLINFO2:1)
D  SQLNAMELEN                    5I 0
D  SQLNAME                      30A
D*  END OF SQLDA
D*  EXTENDED SQLDA
D SQLVAR2         DS
D  SQLLONGL               1      4I 0 
D  SQLRSVDL               5     32A
D  SQLDATAL              33     48*
D  SQLTNAMELN            49     50I 0
D  SQLTNAME              51     80A
D*  END OF EXTENDED SQLDA

ユーザーは、SQL_NUM の定義を行わなければなりません。 SQL_NUM は、SQL_VAR に必要な次元を持つ数値定数として定義する必要があります。

RPG は配列内の構造をサポートしていないので、SQLDA は 3 つの データ構造として生成されます。2 番目および 3 番目のデータ構造を使用すると、フィールド記述が入っている SQLDA の部分をセットアップして参照できます。

SQLDA のフィールド記述をセットするには、プログラムは SQLVAR (または SQLVAR2) のサブフィールドにフィールド記述をセットアップしてから、SQLVAR (または SQLVAR2) の MOVEA を SQL_VAR,n に対して実行します。こ こで、n は SQLDA の中のフィールドの数を表しています。 この動作は、すべてのフィールド記述がセットされるまで繰り返されます。

SQLDA フィールド記述を参照するときに、ユーザーは SQL_VAR,n の MOVEA を SQLVAR (または SQLVAR2) に対して実行 します。ここで、n は処理されるフィールド記述の数を表しています。