SQLRPGLE的诸多问题
我写了一个SQLRPGLE的小程序,功能是提取一个PF中所有数据,赋给变量,然后用变量更新或者插入数据给另一个PF。但是现在遇到2个问题:
1.运行程序后,如果想要CLRPFM第2个PF,提示:MEMBER正在使用中。必须
注销重新登陆才行,这是为什么??
2.代码可能有问题,我执行程序后,他只读取了第一个PF中第1和第3条记录,而且只能插入不能更新,我 晕~ 请大人帮我看看代码。
---声明变量
0001.00 DVXHEMPID S 3A
0002.00 DVXHNAME S 15A
0003.00 DVXHJOB S 10A
0004.00 DISEXIST S 5S 0
----声明游标
0005.00 C/EXEC SQL
0006.00 C+ DECLARE C1 CURSOR FOR SELECT XHEMPID,XHNAME,XHJOB FROM XHZQ
0007.00 C/END-EXEC
---打开游标
0008.00 C/EXEC SQL
0009.00 C+ OPEN C1
0010.00 C/END-EXEC
---当没有出错的时候把游标里的值赋给变量
0011.00 C DOW SQLCOD = 0
0012.00 C/EXEC SQL
0013.00 C+ FETCH C1 INTO :VXHEMPID,:VXHNAME,:VXHJOB
0014.00 C/END-EXEC
---用变量VXHEMPID作为关键字来查找记录是否存在
0015.00 C/EXEC SQL
0016.00 C+ SELECT COUNT(*) INTO :ISEXIST FROM XHZQ1 WHERE XHEMPID1 = :VXHEMPID
---如果不存在就插入记录
0017.00 C/END-EXEC
0018.00 C IF ISEXIST = 0
0019.00 C/EXEC SQL
0020.00 C+ INSERT INTO XHZQ1(XHEMPID1,XHNAME1,XHJOB1)
0021.00 C+ VALUES(:VXHEMPID,:VXHNAME,:VXHJOB)
0022.00 C/END-EXEC
0023.00 C ENDIF
---如果存在就更新记录
0024.00 C IF ISEXIST = 1
0025.00 C/EXEC SQL
0026.00 C+ UPDATE XHZQ1
0027.00 C+ SET XHNAME1 = :VXHNAME,
0028.00 C+ XHJOB1 = :VXHJOB
0029.00 C/END-EXEC
0030.00 C ENDIF
---继续读下一个记录
0031.00 C/EXEC SQL
0032.00 C+ FETCH C1 INTO :VXHEMPID,:VXHNAME,:VXHJOB
0033.00 C/END-EXEC
0034.00 C ENDDO
---关闭游标
0035.00 C/EXEC SQL
0036.00 C+ CLOSE C1
0037.00 C/END-EXEC
---提交所做的更改
0038.00 C/EXEC SQL
0039.00 C+ COMMIT
0040.00 C/END-EXEC
---结束
0041.00 C RETURN
| xuguopeng 回复于:2003-10-28 17:15:05 |
| UPDATE确实是一个问题,我发现了,他把所有记录都改了。。。。。。
ISEXIST这个变量里的值是XHZQ1里面的关键字,肯定是唯一的,所以就用1了,我怎么确认游标是否能更新呢?? |
| 子樵 回复于:2003-10-28 17:07:20 |
| 你确认一下,游标是否可以更新,我以前写这样的程序发现游标是不能更新的.没去研究原因,改用CHAIN解决.
你的思路我觉得没有理解.UPDATE一句,SQL的UPDATE 是这个用法吗?没有WHERE?这句是更新所有记录吧! 另外IF ISEXIST = 1一句ISEXIST 最好改成>0,应用会更广,你不能保证记录唯一. |
| xuguopeng 回复于:2003-10-28 19:54:41 |
| 解决了~ UPDATE放在INSERT前面就可以了,怪了,如果先INSERT就不行 |
| xuguopeng 回复于:2003-10-28 19:20:51 |
| 果然不出子樵所料。。。。。。。
加上WHERE CURRENT OF C1了也是更新不了,只能插入,而且只能插入1,3,4,5。。。。。。的记录,第2条记录总插不上,郁闷~~ |
| 子樵 回复于:2003-10-28 15:09:57 |
| 先提几个问题
1.看这种很要命的代码让人头疼,注意写代码要加注释,这是要培养的习惯. 2.很多问题提出之前建议最好先自己想清楚为什么,先要画个流程图,或者用伪语言写一些流程.这样想着编程逻辑不出错才怪. LOCK问题用WRKACTJOB或者WRKUSRJOB或者WRKOBJLCK 看一下如何LOCK住的.分析一下是程序问题还是存在了COMMIT?如果你程序是异常退出,多看看JOBLOG 不能更新的问题更要看MSG了,这样看程序是很难猜谜的.说实话我是看的不想看了. |
| wildfish 回复于:2003-10-28 15:17:39 |
| 呵呵,我建议用纯rpg,就不会有这个问题,而且速度来的快一些,特别在数据量特别大的时候。一般来说,sqlrpgle,我们都是应用在统计,有太多关联的时候,不过也不是很建议使用。除非很少用的功能。 |
| xuguopeng 回复于:2003-10-28 16:11:51 |
| 2为大哥说的是,只是觉得很简单就没有注释,给大家造成不方便了,不好意思,我已经加上注释了。我知道用RPG比较方便,我只是想测试一下,RPG我已经做成功了。大概的流程就是:
1.用游标把XHZQ里的数据取出来放到VXHEMPID,VXHNAME,VXHJOB 里面 2.然后判断变量里的记录字XHZQ1里面是否存在,如果存在,就更新数据,如果不存在就插入数据。 3.循环读取所有记录并更新XHZQ1。 就这么简单~ 大家帮我看看 |
| ppoint 回复于:2003-10-31 13:36:20 |
| 我的经验是少用游标,麻烦!
你这种情况,2个SQL语句就可以了,也许你只是想研究一下游标用法? 1、UPDATE FILE1 SET FLDX = VALUEX WHERE FLDY = VALUEY 2、INSERT INTO FILE2 VALUES (XXX) WHERE NOT EXISTS (SELECT * FROM FILE1 WHERE FLDY = VALUEY) 另外,SELECT COUNT(*)INTO 后面的变量:ISEXIST 后面一定要加一个指示器变量,否则若记录未找到时会出错,我遇到过的。 SQLCODE 变量判断记录是否存在及执行结果是否出错比较好用,你可以试着用一下。 推荐你一本书,很好,《DB2 400 数据库设计与编程》 |
| xuguopeng 回复于:2003-10-31 14:10:05 |
| 我明白的,只是想测试一下游标的使用方法。SQLCOD我已经引用了呀,但是我只知道SQLSTATE =‘00000’是正常,=‘00010’是警告,=‘00020’是错误,SQLCOD=0是正常,其他的就没细研究。
ISEXIST后面加指示器?? 我后面也有写如果ISEXIST=0做什么啊?吸取宝贵经验了~~~ |
| ppoint 回复于:2003-10-31 17:37:45 |
| SELECT COUNT(*) INTO :ISEXIST [b]:IND[/b]
:IND 就是指示器变量,作用就象WRITE 语句的出错指示器一样。 SQLCOD =100是最常用的,在SELECT UPDATE DELETE 之后,或FETCH已经检索到最后一个可用行。 在SELECT UPDATE DELETE INSERT 语句后最好加上错误处理: SELECT WHEN SQLCOD <0 EXSR SQLERROR WHEN SQLCOD =100 EXSR SQLNOROW WHEN SQLCOD >0 OR SQLWN0<>*BLANKS EXSR SQLWARNING ENDSL |
| xuguopeng 回复于:2003-10-31 19:47:59 |
| 谢谢指教~~ 你说的:IND指示变量,我还有点不太明白,可以举个例子么?
SQLCOD = 100 就是SQLSTATE = ‘02000’吧,也就是检索到底没有找到数据的意思? 还有SQLWN0<>*BLANKS 这个是什么意思??SQLWN0是什么?也是全局变量么?? |
| xiaofeizhu 回复于:2003-11-01 17:16:36 |
| 我理解指示器变量的目的与MONMSG作用类似,出错的话若没有此定义,则会进入异常处理,而定义了则表示你会在程序中做出错的处理,所以有此定义则程序会继续执行下去,否则执行*PSSR或作业MSGW。所以,在COUNT之后最好定义,以免意外中断.
SQLWNO是WARNING NO,没用过.我一般用 C+ WHENEVER SQLERROR GOTO XXXTAG 来监控SQL错误,XXXTAG是SQL错误处理的语句标号,其后是错误的善后处理. |
| xuguopeng 回复于:2003-11-01 17:21:03 |
| 明白了 SQLERROR是全局变量么?可以直接引用?? |
最热门文章推荐:
>· it企业
>· it精英
>· it创业
>· check on it
>· asp文件
>· asp网站
>· asp分页
>· asp实例
↓相关文章:
- · 关于FILES Attribute更改,PF—DTA可不可以改为PF—SRC!
- · 如何取某一日期是一个星期中的哪一天
- · 如何取两日期相差多少小时
- · 另一版本的两日期相差多少天
- · 自动启动TCP/IP的另外一种方法
- · 如何下载AS/400文件并保留其时间不变
- · OS/400与UNIX功能相似的部分命令
- · 如何查用的是哪一个源代码创建的文件
- · 对文件的操作到底对程序的执行效率能影响多少?
- · domino for AS/400一些知识的普及
- · 请教具体如何在Lotus Notes平台编程访问AS/400的DB/2数据库?
- · AS/400开发经验点滴(一)
- · AS/400开发经验点滴(二):一个批量修改文件属性的工具
- · 安装了2989后 telnet 的问题
- · Let AS/400 Page You!
- · 求助:如何实现程序等OBJ的双机拷贝?
- · 对系统中出现的message有相对应的说明吗
- · 求DOMINO FOR AS400 R5 TO R6详细升级步骤
- · AS/400开发经验点滴(三)--如何使用分布式关系数据库
- · INZTAP的参数问题
- · AS/400开发经验点滴(四)--如何在程序中获取系统状态信息
- · 异常IPL的原因归纳
- · 关于文件的 ShareODP 和 USROPN
- · 请教各位:如何查看是谁删除了Library?
- · 除去字符串中任何不需要的东东的思路,仅供参考!!!!!
- · 查看as400下全部USER的几种方法:
- · Fun With Dates In RPGLE
- · as400 I/O 错误小结
- · 我想用ORACLE取AS400的数据,有没有与这个类似的培训!
- · 400中显示在线用户操作记录的方法(用User Space API 实现)
- · 在rpg 里如何对开关进行重命名?
- · AS400 上部署 J2EE 的另一选择-- JBOSS !
- · 问个关于系统MSG的问题?
- · The OS400 Command interface is EXCELLENT, but coukd be impro
- · 帮忙解释安全文档里的一句话
- · 定时启用禁用用户登陆系统的方法
- · 如何更改logon on screen?
- · 跟踪IPL全程、并将产生的spoolfile转成PC上的文本文件,一气呵成.
- · AS400上的FTP可以限制那些用户不能登陆吗?
- · 如何從 AS/400 啟動 PC 程序或 從 PC 啟動 AS/400 程序?
- · 得到4位表示 年份 的新方法?
- · V5R3 CL Programming
- · 原创:建立QINTER外可用于交互式访问的独立子系统
- · hanyu看过来,24小时交易的AS/400如何备份?
- · 磁带放进去就弹不出来三个指示灯一会全亮着
- · 【探讨】如何使用Notes与其它关系数据库进行信息交互?
- · 【探讨】如何限制Notes用户邮箱大小?
- · Some info on AS/400 V5R3
- · iSeries课程学习导航图,给您指引学习或者培训方向。
- · 很菜的问题
- · 关于数据库文件的UC控制的问题
- · 转 Commit/Rollback概念
- · 有倒序排列的KEY值时的SETLL和SETGT
- · 大家帮忙来找茬(到底RPG程序错在哪?)
- · 讨论:关于创建obj时的参数--share
- · 帮忙看看这段程序的问题出在哪里?
- · 《最后100天的AS400学习心情笔记》
- · 在一个PF中加一字段,用来表示记录的序号!
- · SLR60磁带机可以做200GB系统的全系统备份,何故?
- · 讨论系统设备的异动监控
- · 求助:存储过程的查找和COPY
- · 【步骤】使用SQL DTS功能实现从DB/2向SQL Server传输数据.
- · 请教:如何修改PF文件的CCSID值?
- · 关于触发器的初级问题,请用过的大虾指教
- · 如何使用FTP在PC和AS/400之间传输包含中文的文件
- · 各位前辈,小女子是400初学之初学
- · (原)在as400上更换硬盘
- · pcom各种版本的问题总结
- · (如何在iSeries(AS/400)將资料加密(ZT)
- · 急等 如何更改as/400 V4R5 如何更改IP地址
- · 通过Navigator配置实现PC端拨号登陆远程AS/400.
- · 高版本安全数据向低版本系统迁移问题
- · as400与windows如何互相传送文件
- · 【分享】如何实现直接从AS/400发送信息到指定的邮箱.
- · rpg的小问题谁能解决一下,先谢了!(新手)
- · CA连接不上,PCOMM正常使用,授权及网络正常。什么问题?
- · exfmt与write的区别
- · 在TCPIP基础上建立APPC连接
- · 硬盘利用率的问题
- · 如何利用RPG,CL和ACCESS制作一个条形码标签的打印程序?

