奇怪的嵌入式SQL情况

时间:2014-05-22 19:04:48

标签: sql ibm-midrange rpgle

我有一个SQLRPGLE程序,用于更新托盘文件以更改给定位置中所有托盘的状态字段,除了用户在提示时输入的(最多)4。

如果用户输入2-4个托盘,它就像一个魅力,但每次用户只输入1个托盘,它返回一个100的sqlcde(没有找到更新的记录。)我调试了代码并实际复制了在SQL shell中粘贴(更改变量)仍然可以在程序外部工作,但不在内部。

在下面的代码中,当1个托盘在2时进入p2时P1为真,依此类推......

             if (Error=*off);
           strline=%char(XLINE);
           select;

             when p4=true;
             exec sql
             update plt set ptstat='0'
             where ptloc=:strLINE and
             ptplt not in (:xpal1, :xpal2, :xpal3, :Xpal4);
             if sqlcod<>0;
               msgnbr='SQL0001';
               exsr MSG;
               leave;
             endif;

             when p3=true;
             exec sql
             update plt set ptstat='0'
             where ptloc=:strLINE and
             ptplt not  in (:xpal1, :xpal2, :xpal3);
             if sqlcod<>0;
               msgnbr='SQL0001';
               exsr MSG;
               leave;
             endif;

             when p2=true;
             exec sql
             update plt set ptstat='0'
             where ptloc=:strLINE and
             ptplt  not in (:xpal1, :xpal2);
             if sqlcod<>0;
               msgnbr='SQL0001';
               exsr MSG;
               leave;
             endif;

             when p1=true;
             exec sql
             update plt set ptstat='0'
             where ptloc=:strLINE and
             ptplt  not in (:xpal1);
             if sqlcod<>0;
               msgnbr='SQL0001';
               exsr MSG;
               leave;
             endif;

             other;

           ENDSL;                   

有什么想法吗?

我忘了提....原来1托盘的代码是:

             when p1=true;
             exec sql
             update plt set ptstat='0'
             where ptloc=:strLINE and
             ptplt<>:xpal1;
             if sqlcod<>0;
               msgnbr='SQL0001';
               exsr MSG;
               leave;
             endif;

但是没有用,所以我把它改成了第一个试图让它尽可能与工作代码相似的例子。

2 个答案:

答案 0 :(得分:3)

如何简化代码以便不需要四个不同的UPDATE语句?

如果用户未提供所有四个值,请将第一个值复制到其他空字段中。现在你可以说

ptplt not in (:xpal1, :xpal2, :xpal3, :Xpal4);

无论变量中的任何变量是否具有相同的值,都应该得到正确的结果。

答案 1 :(得分:0)

此代码有效:

 D mycnt           s             10i 0 inz( 0 )
 D myName          s             10a   inz( 'ACCP' )
  /free
   *inlr = *on ;

   EXEC SQL  Select count(*) into :mycnt
                 from ACCPTH where APFILE in(:myName) ;

   if SQLCODE = +100 and SQLSTATE = '02000' ;
      dsply 'None 1' ;
   endif ;
   if SQLERRD(3) > 0 ;
      dsply 'None 2' ;
   endif ;
   if mycnt > 0 ;
      dsply 'Found some' ;
   endif ;

   return ;
  /end-free

ACCPTH测试文件是通过对已有文件名为“ACCP”的库运行DSPFD TYPE(* ACCPTH)而创建的。调试显示mycnt在IF语句测试它时具有正确的计数。

如果重复执行EXEC SQL和IF测试部分并为附加代码块添加第二个myName2变量,它将继续正常工作(对我而言)。 myName2变量将具有第二个文件名(或不存在的名称;无关紧要)。

需要有关您的代码的其他详细信息,以便猜测它为什么不适合您。