Example PL/I program that calls a stored procedure

You can call the GETPRML stored procedure that uses the GENERAL WITH NULLS linkage convention from a PL/I program on a z/OS® system.

The following figure contains the example PL/I program that calls the GETPRML stored procedure.

Figure 1. Calling a stored procedure from a PL/I program
*PROCESS SYSTEM(MVS);
 CALPRML:
   PROC OPTIONS(MAIN);
 
   /************************************************************/
   /* Declare the parameters used to call the GETPRML          */
   /* stored procedure.                                        */
   /************************************************************/
   DECLARE PROCNM CHAR(18),    /* INPUT parm -- PROCEDURE name */
           SCHEMA CHAR(8),     /* INPUT parm -- User's schema  */
           OUT_CODE FIXED BIN(31),
                               /* OUTPUT -- SQLCODE from the   */
                               /*   SELECT operation.          */
           PARMLST CHAR(254)   /* OUTPUT -- RUNOPTS for        */
                   VARYING,    /*   the matching row in the    */
                               /*   catalog table SYSROUTINES  */
           PARMIND FIXED BIN(15);
                               /* PARMLST indicator variable   */
   /************************************************************/
   /* Include the SQLCA                                        */
   /************************************************************/
   EXEC SQL INCLUDE SQLCA;
   /************************************************************/
   /* Call the GETPRML stored procedure to retrieve the        */
   /* RUNOPTS values for the stored procedure.   In this       */
   /* example, we request the RUNOPTS values for the           */
   /* stored procedure named DSN8EP2.                          */
   /************************************************************/
   PROCNM = 'DSN8EP2';
                 /* Input parameter -- PROCEDURE to be found   */
   SCHEMA = ' ';
                 /* Input parameter -- SCHEMA in SYSROUTINES   */
   PARMIND = -1; /* The PARMLST parameter is an output parm.   */
                 /* Mark PARMLST parameter as null, so the DB2 */
                 /* requester does not have to send the entire  */
                 /* PARMLST variable to the server.  This      */
                 /* helps reduce network I/O time, because     */
                 /* PARMLST is fairly large.                   */
   EXEC SQL
     CALL GETPRML(:PROCNM,
                       :SCHEMA,
                       :OUT_CODE,
                       :PARMLST INDICATOR :PARMIND);
   IF SQLCODE¬=0 THEN         /* If SQL CALL failed,           */
     DO;
       PUT SKIP EDIT('SQL CALL failed due to SQLCODE = ',
           SQLCODE) (A(34),A(14));
       PUT SKIP EDIT('SQLERRM = ',
           SQLERRM) (A(10),A(70));
     END;
   ELSE                       /* If the CALL worked,           */
     IF OUT_CODE¬=0 THEN      /* Did GETPRML hit an error?     */
       PUT SKIP EDIT('GETPRML failed due to RC = ',
           OUT_CODE) (A(33),A(14));
     ELSE                     /* Everything worked.            */
       PUT SKIP EDIT('RUNOPTS = ', PARMLST) (A(11),A(200));
   RETURN;
 END CALPRML;