Home page

 

Exécuter une instruction SQL   partir d'un programme CL

 

Cet exemple illustre comment utiliser RPG pour exécuter
une instruction SQL autre que SELECT dans un CL

 

 

 

 

Exemple :
 

 

 UTSQL SQL('update   MaBib/MonFic   set   MaZone = 'MaValeur'    Where ... )

 

 

 

 

Commande UTSQL
 

 


	CMD PROMPT('SQL Execute Immediate')
	
	PARM KWD(SQL) TYPE(*CHAR) LEN(2000) MIN(1) +
		PROMPT('Insert-Update-Delete.NO Select')

	PARM KWD(CR) TYPE(*CHAR) LEN(1) DSPINPUT(*NO) +
		CHOICE(*NONE)

 

 

 

 

 

Programme CL UTSQLC (CPP de la commande UTSQL)

 


pgm &pa_sql
dcl &pa_sql *char 2000

dcl &pa_cr *dec ( 1 0 ) 0

dcl &msg *char 80
dcl &msgid *char 7
dcl &msgf *char 10
dcl &msgdta *char 512

call utsql ( &pa_sql &pa_cr )

z010:
rcvmsg 	pgmq( *same ) 		+
	msgtype( *any ) 	+
	msg( &msg ) 		+
	msgdta( &msgdta ) 	+
	msgid( &msgid ) 	+
	msgf( &msgf )

if ( &msg *ne ' ' ) do

sndpgmmsg msgid( &msgid ) msgf( &msgf ) msgdta( &msgdta )

enddo

endpgm
 
 
 

Programme RPG IV UTSQL

 

 

 

         

     h dftactgrp( *no ) actgrp( *caller )

      *---------------------------------------------------------------------
      * Create parm prototypes
      *---------------------------------------------------------------------
     d SndPgmMsg       PR                  ExtPgm('QMHSNDPM')
     d   MessageID                    7    Const
     d   QualMsgF                    20    Const
     d   MsgData                    256    Const
     d   MsgDtaLen                   10i 0 Const
     d   MsgType                     10    Const
     d   CallStkEnt                  10    Const
     d   CallStkCnt                  10i 0 Const
     d   MessageKey                   4
     d   ErrCode                       *   Const

      *---------------------------------------------------------------------
      * Stand Alone Fields
      *---------------------------------------------------------------------
     d pa_sql          s           2000
     d pa_cr           s              1  0
     d msgid           s              7
     d msgdta          s             80
     d msgtype         s             10
     d CallStkCnt      s             10i 0
     d wwTheKey        s              4
     d codsql          s                   like(sqlcod)

     d wsq             ds
     d wsqcod                         9
     d wsqnum                         3    overlay(wsqcod:6)

      **************************************************************
      *                                                            *
      *   Execute immediate: INSERT, UPDATE, DELETE, CREATE, etc.  *
      *        ( SELECT direct (full select) pas admis )       *
      *                                                            *
      **************************************************************
     c     *entry        plist
     c                   parm                    pa_sql
     c                   parm                    pa_cr

     c/Exec sql  Set Option Commit = *None
     c/End-Exec

     c                   eval      *inlr = *on
     c                   eval      pa_cr = 0

     c/Exec sql  Execute immediate :pa_sql
     c/End-Exec

      * sqlcod < 0 --> Error
     c                   if        sqlcod < 0
     c                   eval      pa_cr = -1
     c                   eval      codsql = sqlcod * -1
     c                   eval      wsqcod = %editc(codsql:'X')
     c                   eval      msgid = 'SQL' + %subst(wsqcod: 6: 4)
     c                   eval      msgtype = '*DIAG'

     c                   else

     c                   if        %subst(sqlerr: 21: 1) <> x'00'
     c                   eval      msgid = 'SQL' + %subst(sqlerr: 21: 4)
     c                   else
     c                   eval      wsqcod = %editc(sqlcod:'X')
     c                   eval      msgid = 'SQL' + %subst(wsqcod: 6: 4)
     c                   endif

     c                   eval      msgtype = '*INFO'
     c                   endif

     c                   eval      CallStkCnt = 2
     c                   callp     SndPgmMsg(  msgid               :
     c                                        'QSQLMSG   *LIBL'    :
     c                                         SQLERM              :
     c                                         SQLERL              :
     c                                         msgtype  :'*'       :
     c                                         CallStkCnt:wwTheKey:
     c                                         *null   )
     c                   return