免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xuguopeng
打印 上一主题 下一主题

SQLRPGLE的诸多问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-10-31 17:37 |只看该作者

SQLRPGLE的诸多问题

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

论坛徽章:
0
12 [报告]
发表于 2003-10-31 19:47 |只看该作者

SQLRPGLE的诸多问题

谢谢指教~~ 你说的:IND指示变量,我还有点不太明白,可以举个例子么?
SQLCOD = 100 就是SQLSTATE = ‘02000’吧,也就是检索到底没有找到数据的意思?
还有SQLWN0<>;*BLANKS 这个是什么意思??SQLWN0是什么?也是全局变量么??

论坛徽章:
0
13 [报告]
发表于 2003-11-01 17:16 |只看该作者

SQLRPGLE的诸多问题

我理解指示器变量的目的与MONMSG作用类似,出错的话若没有此定义,则会进入异常处理,而定义了则表示你会在程序中做出错的处理,所以有此定义则程序会继续执行下去,否则执行*PSSR或作业MSGW。所以,在COUNT之后最好定义,以免意外中断.

SQLWNO是WARNING NO,没用过.我一般用
C+ WHENEVER SQLERROR GOTO XXXTAG

来监控SQL错误,XXXTAG是SQL错误处理的语句标号,其后是错误的善后处理.

论坛徽章:
0
14 [报告]
发表于 2003-11-01 17:21 |只看该作者

SQLRPGLE的诸多问题

明白了 SQLERROR是全局变量么?可以直接引用??

论坛徽章:
0
15 [报告]
发表于 2013-05-22 22:48 |只看该作者
xuguopeng 发表于 2003-10-31 19:47
谢谢指教~~ 你说的:IND指示变量,我还有点不太明白,可以举个例子么?
SQLCOD = 100 就是SQLSTATE = ‘02 ...


指示器变量主要有两个用途:1,标记空值;2,标记截断。
具体来说:
1,select sum(x) into :var :ind from mytab where ....
如果where条件限制下并无满足条件的的记录,那么sum(x)应该为空值。可是,这个“NULL”如何告知程序的宿主变量呢?标准规定:如果是空值,那么ind置为小于零(-1)的值;
同样的,如果要插入空值,ind=-1; insert into mytab (x) values (:var :ind); 即可。
2,标记截断
var长度为1,那么select 'ab' into :var :ind from mytab .....
显然,‘ab'并不能完整的放入变量var,标准规定,此时ind置为大于0的值(1)。

3,特别的,在您的例子里面,
select count(*) into :var ....
这个聚合是肯定不需要使用:ind的,因为这条语句肯定有唯一的一条记录,不可能出现NULL。

4,最后,一般而言,并不需要select count(*)预先进行存在性判定;直接update即可,如果SQLCODE>0表明并不存在该记录,在直接插入该记录即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP