当前位置: 代码迷 >> PB >> PB脚本游标 新的有关问题
  详细解决方案

PB脚本游标 新的有关问题

热度:91   发布时间:2016-04-29 08:45:17.0
PB脚本游标 新的问题。

DECLARE YPKC_cur CURSOR FOR
SELECT KCSL,MRDJ,PFDJ,LSDJ,PH,SCCJ,YXQ,RKDH,RKXLH,GMP,QS,IFZB,ZL,GMPXJ,NOGMPXJ
FROM YK_YPKC
WHERE YKH = :gl_ykdm AND YPDM = :YPDM AND KCSL > 0 AND itempkg_id = :ls_itempkg_id
Order By YXQ,RKRQ;
OPEN YPKC_cur;
FETCH YPKC_cur INTO :KCSL,:MRDJ,:PFDJ,:LSDJ,:PH,:SCCJ,:YXQ,:RKDH,:RKXLH,:GMP,:QS,:IFZB,:ZL,:XJ1,:XJ2;
DO WHILE sl > 0
  ......
FETCH NEXT YPKC_cur  
  INTO :KCSL,:MRDJ,:PFDJ,:LSDJ,:PH,:SCCJ,:YXQ,:RKDH,:RKXLH,:GMP,:QS,:IFZB,:ZL,:XJ1,:XJ2;
LOOP
CLOSE YPKC_cur; 

以上是原来的游标。


现在我想让如果全局变量gs_li=1时
SELECT KCSL,MRDJ,PFDJ,LSDJ,PH,SCCJ,YXQ,RKDH,RKXLH,GMP,QS,IFZB,ZL,GMPXJ,NOGMPXJ
FROM YK_YPKCTJ
WHERE YKH = :gl_ykdm AND YPDM = :YPDM AND KCSL > 0
否则取别外一个表的信息。
由于do while里的内容太多,我想 OPEN YPKC_cur;
FETCH YPKC_cur INTO :KCSL,:MRDJ,:PFDJ,:LSDJ,:PH,:SCCJ,:YXQ,:RKDH,:RKXLH,:GMP,:QS,:IFZB,:ZL,:XJ1,:XJ2;
DO WHILE sl > 0
  ......
FETCH NEXT YPKC_cur  
  INTO :KCSL,:MRDJ,:PFDJ,:LSDJ,:PH,:SCCJ,:YXQ,:RKDH,:RKXLH,:GMP,:QS,:IFZB,:ZL,:XJ1,:XJ2;
LOOP
CLOSE YPKC_cur; 这些内容不变的情况下更新一下游标的写法。
但if判断不行。两种IF方法都不行。怎么办呢??


------解决方案--------------------
一、一般情况下,不建议使用游标,性能低下且特占服务器资源,N年前我也喜欢写游标,简单直接,N年后我的程序里基本上看不到游标的影子了,建议使用数据窗口替代;

二、你的sl是什么值,游标的的终止应该是判断sqlca的值的,你的sl是什么条件?
------解决方案--------------------
C# code
if gs_li=1 thenDECLARE YPKC_cur CURSOR FOR SELECT KCSL,MRDJ,PFDJ,LSDJ,PH,SCCJ,YXQ,RKDH,RKXLH,GMP,QS,IFZB,ZL,GMPXJ,NOGMPXJ FROM YK_YPKC WHERE YKH = :gl_ykdm AND YPDM = :YPDM AND KCSL > 0 AND itempkg_id = :ls_itempkg_id Order By YXQ,RKRQ; elseDECLARE YPKC_cur CURSOR FOR SELECT KCSL,MRDJ,PFDJ,LSDJ,PH,SCCJ,YXQ,RKDH,RKXLH,GMP,QS,IFZB,ZL,GMPXJ,NOGMPXJ FROM 另一个表end ifOPEN YPKC_cur;
------解决方案--------------------
你可以用动态游标
delcare dynamic cursor 游标名 for sqlsa;
prepare sqlsa from :ls_sql;(把表名以及条件组成SQL语句的字符串)
open dynamic 游标名;
...
close 游标名;
------解决方案--------------------
DO WHILE sl > 0 
loop

s1是什么东东?
通常的语法是
do while sqlca.sqlcode=0
loop

还有就是绝对同意楼上的朋友们提到的使用datastore~方便简单并且速度快
  相关解决方案