PB脚本游标 新的问题。

lijingworkhard 2010-01-09 09:37:23

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方法都不行。怎么办呢??
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaoleo 2010-01-17
  • 打赏
  • 举报
回复
DO WHILE sl > 0
loop

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

还有就是绝对同意楼上的朋友们提到的使用datastore~方便简单并且速度快
DYFDWX 2010-01-11
  • 打赏
  • 举报
回复
用datastore来做,快
builderwfy 2010-01-11
  • 打赏
  • 举报
回复
一般建議用數據存儲來處理,因為用遊標效率很低而且占用服務器
sewinten 2010-01-10
  • 打赏
  • 举报
回复
最好使用datastore , 通过变更datastroe的dataobject,就能实现你要的效果了,比你用游标更方便,效率更高。
swallowluo 2010-01-10
  • 打赏
  • 举报
回复
当然动态游标的效率比静态游标的效率要更低,但是如果对效率要求不高还是挺方便的。
swallowluo 2010-01-10
  • 打赏
  • 举报
回复
你可以用动态游标
delcare dynamic cursor 游标名 for sqlsa;
prepare sqlsa from :ls_sql;(把表名以及条件组成SQL语句的字符串)
open dynamic 游标名;
...
close 游标名;
QY_QU 2010-01-09
  • 打赏
  • 举报
回复
同意! 使用datastore,来的快一些,后期维护也方便.
dahaidao 2010-01-09
  • 打赏
  • 举报
回复
写个数据窗口,来得快啊。
jimwoo 2010-01-09
  • 打赏
  • 举报
回复
if gs_li=1 then
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;
else
DECLARE YPKC_cur CURSOR FOR
SELECT KCSL,MRDJ,PFDJ,LSDJ,PH,SCCJ,YXQ,RKDH,RKXLH,GMP,QS,IFZB,ZL,GMPXJ,NOGMPXJ
FROM 另一个表
end if
OPEN YPKC_cur;

建议用datastore代替游标
pb8 2010-01-09
  • 打赏
  • 举报
回复
一、一般情况下,不建议使用游标,性能低下且特占服务器资源,N年前我也喜欢写游标,简单直接,N年后我的程序里基本上看不到游标的影子了,建议使用数据窗口替代;

二、你的sl是什么值,游标的的终止应该是判断sqlca的值的,你的sl是什么条件?
PowerBuilder是美国Powersoft公司于90年代初推出的基于客户/服务器体系结构的面向对象的数据库开发工具。该产品一上市即深受广大应用开发人员的喜爱,因此迅速占领市场,目前几乎已发展成为前端工具的事实上的标准。著名数据库软件公司Sybase收购Powersoft公司以后,PowerBuilder通过Sybase较早地介绍给了中国用户。 1994年Powersoft公司又在北京建立办事处,PowerBuilder便广泛为中国的用户接受和使用。所开发的应用已广泛地应用于金融、证券、邮电、商业等各个部门和各个领域,并发挥着巨大的作用。据有关方面统计,PowerBuilder在中国的市场占有率目前已达40%左右。 Sybase公司及其代理商在从事PowerBuilder的销售、培训和技术支持等服务时,经常发现由于用户来自各个行业,专业背景不同,开发经验不同,再兼之国内的有关书籍和资料较少,因此造成用户对Power-Builder的很多特性不甚了解, 在进行深入开发时遇到了很多困难。鉴于此,开办PowerBuilder应用开发系列讲座,本讲座面向正在使用PowerBuilder进行开发的读者, 主要讨论使用PowerBuilder进行数据库应用开发的经验和开发技巧。

* 第一讲: 数据库的事务管理
* 第二讲: 调用Windows的动态链接库
* 第三讲: PowerBuilder面向对象的程序设计
* 第四讲: 并发控制
* 第五讲: DataWindow的打印输出
* 第六讲: DataWindow的打印输出(续)
* 第七讲: 利用SetActionCode函数控制DataWindow
* 第八讲: 分布式PowerBuilder设计
* 第九讲: DataWindow的数据缓冲区
* 第十讲: 用DataWindow实现对多表的修改
* 第十一讲:游标的使用
* 第十二讲:预装入对象
* 第十三讲:资源管理
* 第十四讲:PowerBuilder的事件
* 第十五讲:PowerBuilder的事件(续)
* 第十六讲:生成可重用的数据窗口
* 第十七讲:编写行选择函数
* 第十八讲:优化数据库查询
* 第十九讲:使用PowerBuilder另外500个函数(上)
* 第二十讲:使用PowerBuilder另外500个函数(中)
* 第二十一讲:使用PowerBuilder另外500个函数(下)
* 第二十二讲:树型视图控件
* 第二十三讲:函数与事件
* 第二十四讲:Install Builder 的使用方法
* 第二十五,二十六讲:一个代码维护的应用程序(上、下)
* 第二十七讲:在 PowerScript 脚本中访问数据窗口中的数据
* 第二十八讲:开发和运行环境中的动态连接库
* 第二十九讲:如何使用 BLOB 数据类型
* 第三十讲:在数据窗口中使用滚动条
* 第三十一讲:在数据窗口中使用滚动条(续)
* 第三十二讲:为下拉式数据窗口建立缓冲区
* 第三十三讲:为下拉式数据窗口建立缓冲区(续)
* 第三十四讲:布式事务处理
* 第三十五讲:布式应用开发
* 第三十六讲:FUNCky 的使用
* 第三十七讲:PFC介绍
* 第三十八讲:PowerBuilder 6.0 简介
* 第三十九讲:图形用户界面设计
* 第四十讲:图形用户界面设计(续)
存储过程的安全及性能优化 存储过程分类  系统存储过程  自定义存储过程  SQL Server使用者编写的存储过程  扩展存储过程  动态链接库(DLL)函数的调用看,主要用于客户端和服务器端之间进行通信  exec master..xp_cmdshell 'dir *.exe' -- 执行目录命令查询[sql2005\sql2008]  exec master..xp_fixeddrives --列出硬盘分区各自可用空间  xp_regwrite根键,子键,值名,值类型,值【sql2008拒绝访问】  写入注册表,例如:  exec master..db.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\run','TestValueName','reg_sz','hello'  xp_regdeletevalue 根键,子键,值名【sql2008拒绝访问】  删除注册表某个值  xp_regdeletekey键,值【sql2008拒绝访问】  删除该键下包括的所有值 xp_cmdshell语法  xp_cmdshell {'command_string'} [,no_output]  command_string是在操作系统命令行解释器上执行的命令字符串。command_string数据类型为varchar(255)或者nvarchar(4000),没有默认值  no_output为可选参数,可以控制是否想客户端返回信息  该存储过程一般情况下被禁用的,需要手动开启使用,如下:  exec sp_configure 'show advanced options',1  go   reconfigure  go   exec sp_configure 'xp_cmdshell',1—1表示启用,0表示禁用  go   reconfigure  go 删除xp_cmdshell SQL SERVER200删除xp_cmdshell use master exec sp_dropextendedproc 'xp_cmdshell' go SQL SERVER2005以上禁用xp_cmdshell,但不能删除掉 exec sp_configure 'xp_cmdshell',0 —1表示启用,0表示禁用  go reconfigure --让sp_configurre立即生效  go  exec sp_configure 'show advanced options',0  go   reconfigure  go --注意:SQL SERVER2008考虑安全性很多存储过程直接被拒绝访问 恢复/启用扩展存储过程 SQLServer2000 use master exec sp_addextendedproc xp_cmdshell,'xplog70.dll' go SQL Server2005或SQL Server2008启用xp_cmdshell  exec sp_configure 'show advanced options',1  go   reconfigure  go   exec sp_configure 'xp_cmdshell',1—1表示启用,0表示禁用  go   reconfigure  go 扩展存储过程的定义  扩展存储过程是SQL Server中的另一类存储过程,它是以其它语言编写的外部程序,是以动态链接库(DLL)形式存储在服务器上,最终SQLServer就可以动态加载并执行它们  编写好后使用SQLServer的固定角色sysadmin注册该扩展存储过程,并将执行权限授予其它用户,这个扩展存储过程只能添加到master数据库。  在编写扩展存储过程中可能要用到某些系统存储过程,这些系统存储过程如下: 利用OLE自动化存储过程调用dll 1.创建类库程序集 namespace PB_ExtendProcedure { public class ExtendProcedure { public string SayHi() { return "hello world"; } } } 2.生成动态链接库并注册到系统中 2.1.生成动态链接库使用VS2010命令行工具 使用sn命令生成一个强命名文件: sn -k he

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧