例 1: ILE C プログラムから呼び出される ILE C および PL/I プロシージャー

この例では、CREATE PROCEDURE 定義を使用してプロシージャー P1 および P2 を呼び出す、ILE C プログラムを示します。プロシージャー P1 は ILE C で作成されていて、10 個のパラメーターがあります。 プロシージャー P2 は PL/I で作成されていて、やはり、10 個のパラメーターがあります。

P1 および P2 プロシージャーの定義

EXEC SQL CREATE PROCEDURE P1 (INOUT PARM1 CHAR(10),
                               INOUT PARM2 INTEGER,
                               INOUT PARM3 SMALLINT,
                               INOUT PARM4 FLOAT(22),
                               INOUT PARM5 FLOAT(53),
                               INOUT PARM6 DECIMAL(10,5),
                               INOUT PARM7 VARCHAR(10),
                               INOUT PARM8 DATE,
                               INOUT PARM9 TIME,
                               INOUT PARM10 TIMESTAMP)
           EXTERNAL NAME  TEST12.CALLPROC2
           LANGUAGE C GENERAL WITH NULLS

EXEC SQL CREATE PROCEDURE P2 (INOUT PARM1 CHAR(10),
                               INOUT PARM2 INTEGER,
                               INOUT PARM3 SMALLINT,
                               INOUT PARM4 FLOAT(22),
                               INOUT PARM5 FLOAT(53),
                               INOUT PARM6 DECIMAL(10,5),
                               INOUT PARM7 VARCHAR(10),
                               INOUT PARM8 DATE,
                               INOUT PARM9 TIME,
                               INOUT PARM10 TIMESTAMP)
           EXTERNAL NAME  TEST12.CALLPROC
           LANGUAGE PLI GENERAL WITH NULLS 
注: コード例を使用する場合は、コードに関するライセンス情報および特記事項のご使用条件に同意する必要があります。

P1 および P2 プロシージャーの呼び出し

/**************************************************************/
/*********** START OF SQL C Application ***********************/

#include <stdio.h>
#include <string.h>
#include <decimal.h>
main()
{
 EXEC SQL INCLUDE SQLCA;
 char PARM1[10];
 signed long int PARM2;
 signed short int PARM3;
 float PARM4;
 double PARM5;
 decimal(10,5) PARM6;
 struct { signed short int parm7l;
          char parm7c[10];
        } PARM7;
char PARM8[10];        /* FOR DATE */
char PARM9[8];         /* FOR TIME */
char PARM10[26];       /* FOR TIMESTAMP */
 
/*******************************************************/
/* Initialize variables for the call to the procedures */
/*******************************************************/
strcpy(PARM1,"PARM1");
PARM2 = 7000;
PARM3 = -1;
PARM4 = 1.2;
PARM5 = 1.0;
PARM6 = 10.555;
PARM7.parm7l = 5;
strcpy(PARM7.parm7c,"PARM7");
strncpy(PARM8,"1994-12-31",10);         /* FOR DATE      */
strncpy(PARM9,"12.00.00",8);            /* FOR TIME      */
strncpy(PARM10,"1994-12-31-12.00.00.000000",26);
                                        /* FOR TIMESTAMP */
/***********************************************/
/* Call the C procedure                        */
/*                                             */
/*                                             */
/***********************************************/
EXEC SQL CALL P1 (:PARM1, :PARM2, :PARM3,
                  :PARM4, :PARM5, :PARM6,
                  :PARM7, :PARM8, :PARM9,
                  :PARM10 );
if (strncmp(SQLSTATE,"00000",5))
 {
 /* Handle error or warning returned on CALL statement */
 }

/* Process return values from the CALL.                 */
:


/***********************************************/
/* Call the PLI procedure                      */
/*                                             */
/*                                             */
/***********************************************/
/* Reset the host variables before making the CALL      */
/*                                                      */
:
EXEC SQL CALL P2 (:PARM1, :PARM2, :PARM3,
                  :PARM4, :PARM5, :PARM6,
                  :PARM7, :PARM8, :PARM9,
                  :PARM10 );
if (strncmp(SQLSTATE,"00000",5))
 {
  /* Handle error or warning returned on CALL statement */
}
/* Process return values from the CALL.                 */
:
}

/******** END OF C APPLICATION **********************************/
/****************************************************************/

プロシージャー P1

/******** START OF C PROCEDURE P1 *******************************/
/*        PROGRAM TEST12/CALLPROC2                              */
/****************************************************************/

#include <stdio.h>
#include <string.h>
#include <decimal.h>
main(argc,argv)
  int argc;
  char *argv[];
  {
    char parm1[11];
    long int parm2;
    short int parm3,i,j,*ind,ind1,ind2,ind3,ind4,ind5,ind6,ind7,
              ind8,ind9,ind10;
    float parm4;
    double parm5;
    decimal(10,5) parm6;
    char parm7[11];
    char parm8[10];
    char parm9[8];
    char parm10[26];
    /* *********************************************************/
    /* Receive the parameters into the local variables -       */
    /* Character, date, time, and timestamp are passed as      */
    /* NUL terminated strings - cast the argument vector to    */
    /* the proper data type for each variable. Note that       */
    /* the argument vector can be used directly instead of     */
    /* copying the parameters into local variables - the copy  */
    /* is done here just to illustrate the method.             */
    /* *********************************************************/

    /* Copy 10 byte character string into local variable      */
    strcpy(parm1,argv[1]);

    /* Copy 4 byte integer into local variable                */
    parm2 = *(int *) argv[2];

    /* Copy 2 byte integer into local variable                */
    parm3 = *(short int *) argv[3];

    /* Copy floating point number into local variable         */
    parm4 = *(float *) argv[4];

    /* Copy double precision number into local variable       */
    parm5 = *(double *) argv[5];

    /* Copy decimal number into local variable                */
    parm6 = *(decimal(10,5) *) argv[6];
/**********************************************************/
/* Copy NUL terminated string into local variable.         */
/* Note that the parameter in the CREATE PROCEDURE was   */
/* declared as varying length character. For C, varying   */
/* length are passed as NUL terminated strings unless     */
/* FOR BIT DATA is specified in the CREATE PROCEDURE     */
/**********************************************************/
strcpy(parm7,argv[7]);

/**********************************************************/
/* Copy date into local variable.                         */
/* Note that date and time variables are always passed in */
/* ISO format so that the lengths of the strings are      */
/* known. strcpy works here just as well.                 */
/**********************************************************/
strncpy(parm8,argv[8],10);

/* Copy time into local variable                          */
strncpy(parm9,argv[9],8);

/**********************************************************/
/* Copy timestamp into local variable.                    */
/* IBM SQL timestamp format is always passed so the length*/
/* of the string is known.                                */
/**********************************************************/
strncpy(parm10,argv[10],26);

/**********************************************************/
/* The indicator array is passed as an array of short     */
/* integers. There is one entry for each parameter passed */
/* on the CREATE PROCEDURE (10 for this example).        */
/* Below is one way to set each indicator into separate   */
/* variables.                                             */
/**********************************************************/
   ind = (short int *) argv[11];
   ind1 = *(ind++);
   ind2 = *(ind++);
   ind3 = *(ind++);
   ind4 = *(ind++);
   ind5 = *(ind++);
   ind6 = *(ind++);
   ind7 = *(ind++);
   ind8 = *(ind++);
   ind9 = *(ind++);
   ind10 = *(ind++);
  :
/* Perform any additional processing here                 */
  :
return;
}
/******** END OF C PROCEDURE P1 *******************************/

プロシージャー P2

/******** START OF PL/I PROCEDURE P2 **************************/
/******** PROGRAM TEST12/CALLPROC *****************************/
/**************************************************************/


CALLPROC :PROC( PARM1,PARM2,PARM3,PARM4,PARM5,PARM6,PARM7,
                        PARM8,PARM9,PARM10,PARM11);
 DCL  SYSPRINT FILE STREAM OUTPUT EXTERNAL;
 OPEN FILE(SYSPRINT);
 DCL PARM1 CHAR(10);
 DCL PARM2 FIXED BIN(31);
 DCL PARM3 FIXED BIN(15);
 DCL PARM4 BIN FLOAT(22);
 DCL PARM5 BIN FLOAT(53);
 DCL PARM6 FIXED DEC(10,5);
 DCL PARM7 CHARACTER(10) VARYING;
 DCL PARM8 CHAR(10);      /* FOR DATE */
 DCL PARM9 CHAR(8);       /* FOR TIME */
 DCL PARM10 CHAR(26);     /* FOR TIMESTAMP */
 DCL PARM11(10) FIXED BIN(15);   /* Indicators */

 /* PERFORM LOGIC - Variables can be set to other values for  */
 /* return to the calling program.                            */

 :

 END CALLPROC;