- 论坛徽章:
- 0
|
CL1的代码:
......
OVRDBF (FILE1) (LIB1/FILE1) SHARE(*YES)
OVRDBF (FILE2) (LIB1/FILE2) SHARE(*YES)
CALL (RPG1)
DLTOVR FILE1
DLTOVR FILE2
RGZPFM FILE1
RGZPFM FILE2
......
RPG1的代码:
......
FFILE2 IF K DISK *INfSR(*PSSR)
......
C/EXEC SQL
C+ DELETE FROM FILE1 WHERE FIELD1 = VALUE1
C/END-EXEC
......
C 1 DO 10 I
C ARR(I) IFNE *BLANK
C MOVE ARR(I) VAR1
C/EXEC SQL
C+ DELETE FROM FILE2 WHERE FIELD2 = :VAR1
C/END-EXEC
C ELSE
C LEAVE
C ENDIF
C ENDDO
代码没有写全,就写上个意思。我就简单说一下,CL的作用就是over ride那两个PF,然后call那个SQLRPG,然后再对两个PF进行RGZPFM。而SQLRPG里面分别对这两个文件进行数据的删除,对于文件FILE1来说,只删除一次,就是那个FIELD1符合VALUE1的这个情况;而对FILE2,要删除的就是符合FIELD2的值等于数组ARR(I)里面的各个非空白的值,如果到ARR(I)有元素空白了,那就结束这个DO的循环了。其实这样编译后运行是没有错误的,问题是我的FILE1和FILE2之间有一个共同的LF,就是FILE_LF。这个FILE_LF里面有两个record format,两个PFILE分别就是FILE1和FILE2了。就是把FILE1和FILE2的record format一起写到了FILE_LF这个LF中。其实FILE1和FILE2有一个共同的LF还不能导致我接下来的这个问题,导致我出现问题的是FILE2的删除要执行两次的情况,就是ARR(I)里面有两个非空的值,这样我的DO就要执行两次。经过我的DEBUG发现,因为我在F定义区那里定义了FILE2,所以在我程序执行时,是锁住FILE2的,没有锁住FILE1,但是我的DO如果要执行两次,就是要执行两次DELETE的SQL语句,第一次执行完了,程序锁住的还是FILE2,但是当第二次执行完,程序锁住的除了FILE2外,还有FILE_LF这个LF也被锁了!而且直至这个SQLRPG结束了,回到了CL,要执行RGZPFM的时候,FILE2和FILE_LF还是被锁着,结果就出错了,但是出错的信息竟然是说FILE1的“Access path has already in use...”之类的话。这个就是我遇到的问题,我来归结一下出现的条件:
1)一定要是BATCH JOB才出现这个问题,会出现MSGW告诉你FILE1在in use,直接CALL是不会出现问题的。
2)DO里面的SQL语句要执行两次以上。
3)SQLRPG对两个文件进行操作时,这两个文件有一个LF是以他们各自record format为内容生成的。我这个LF的情况是FILE1的是第一个format,FILE2的是第二个format。
解决方案:现在我能做的解决方案就是把DO里面的要执行的都单独写出来了,就是如果说ARR(I)有10个元素,那样我就写10条SQL语句,分别对ARR(1),ARR(2)...ARR(10)进行判断。
各位知道其中的原因吗?为什么这个LF会在第二次DO就突然出现,而且SQLRPG结束了还显示被锁着,当然显示锁着的程序是CL1那个程序,可是这个LF在整个CL到SQLRPG中都没有调用到,我试过把这个LF删除了,结果确实可以在SQLRPG中DO两次以上,回到CL中也不会MSGW,但是这个LF这么写是有其它程序需要用到的,所以删除LF的方法不行。各位就帮帮忙分析一下吧~! |
|