× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.





Hi all,

I have this problem that I like to share, hopefully you will be able to help.
Please bear with me.

I have this CL driver program that will:
*    prepare a work file
*    call an SQLRPGLE program that will update the work file.

It's not going to be built in QTEMP, because this program is intended to be ran
by 1 person only (that's not supposed to be hard ;), plus it's going to automate
the data transfer to PC (no QTEMP allowed).

In the CL, I allocate the work file exclusively, clear it and then I lower the
lock-level, so that it can still do the automated transfer to PC:

***********************************************************
/* Allocate object exclusively */
             ALCOBJ     OBJ((*LIBL/WQBL001WK *FILE *EXCL)) WAIT(0)

/* If it's *LOCKED, Exit. */
             MONMSG     MSGID(CPF1002) EXEC(DO)
             CHGVAR     VAR(&MSG) VALUE('The time report query +
                          process is already active. Please try +
                          again.')
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&MSG) +
                             TOPGMQ(*EXT) MSGTYPE(*INFO)
             GOTO       CMDLBL(ENDP)
             ENDDO

/* Clear the work file in Data Library */
             CLRPFM     FILE(WQBL001WK)

/* Once the *EXCL lock is obtained, lowering the lock-level to avoid
lock-conflict */
/* especially when running the data transfer to PC */
             ALCOBJ     OBJ((*LIBL/WQBL001WK *FILE *SHRRD)) WAIT(0)
             DLCOBJ     OBJ((*LIBL/WQBL001WK *FILE *EXCL))
/* Call bound: The Query program */
PROCESS:
             CALLPRC    PRC(TR0005R) PARM(&PARMS)

/* Deallocate the work file */
           DLCOBJ     OBJ((*LIBL/WQBL001WK *FILE *SHRRD))

             GOTO       CMDLBL(ENDP)

...
/* Program end */
 ENDP:
             ENDPGM
***********************************************************
In the SQLRPGLE I do the "EXECUTE IMMEDIATE" statement of INSERT to the work
file, which then will be transferred to PC (with automated transfer: RTOPCB.EXE
*.DTF).

 * Build the whole SQL string
C                   clear                   sqlslt
C                   movea     sqb           sqlslt
C                   eval      sqlslt = %trim(sqlslt) + ' ' +
C                                      %trim(#wherestm)

C/EXEC SQL
C+ Execute Immediate :sqlslt
C/END-EXEC
***********************************************************

The problem is when I test it, using 2 sessions (say A and B):
*    Call the program from sess A (and monitor the lock from sess B)
     ==> no lock after pgm completed.
*    Call the program again, 2nd try, from sess A.
     ==> there's an object lock left, after pgm completed, with *SHRRD.
     ==> as a result, I can't access the pgm from sess B.

Is there something that I miss?
Do I need to do something on the SQLRPGLE to "release" the lock for "EXECUTE
IMMEDIATE"?


Thanks,

Jean Reksodiputro
Harrisburg, PA






As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.