免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4092 | 回复: 2
打印 上一主题 下一主题

两个iSeries存储过程的示例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-08 17:09 |只看该作者 |倒序浏览
1.外部存储过程--觉得这个比较好,可以挽救封装的比较好的RPG或者CL程序.效率上也是很显著的,
   毕竟是Direct IO
   绑定CL的,比较简单,SQLRPG的还没搞定,有知道的人告诉我,因为我已经根据参数设定DS,结果还是不行.

  1. CREATE PROCEDURE EMPLIB.SP_EQCHKLN(
  2.    IN CKDATE CHAR(8),
  3.    IN CKDEPT CHAR(2),
  4.    IN CKUSRNM CHAR(10) )
  5. RESULT SET 0
  6. EXTERNAL NAME EMPLIB.EQCHKLNCL
  7. LANGUAGE CL
  8. PARAMETER STYLE GENERAL
复制代码

解说:
   标准语法CREATE PROCEDURE 库名.存储过程名
  参数有 IN OUT INOUT三种类型
  参数类型是常规的--可能是DB2默认的,不是太清楚.
  指定外部程序名 EMPLIB.EQCHKLNCL--参数3个,也是CKDATE CKDEPT USRNM
  指定外部程序使用的语言. 简单吧,只需要把CL稍微封装,我们就可以调用服务器的程序.
  或者使用CALL 的方式,但是比较麻烦,个人觉得使用这种方式比较好.
  
2.SQL存储过程-使用参数形式,预编译
  1. CREATE PROCEDURE EMPLIB.SP_GETCHKTX (
  2. IN CKDATE CHAR(8) ,
  3. IN CKDEPT CHAR(2) ,
  4. IN CKUSRNM CHAR(10) )
  5. RESULT SETS 1
  6. LANGUAGE SQL
  7. SPECIFIC EMPLIB.SP_GETCHKTX
  8. READS SQL DATA
  9. BEGIN
  10.    DECLARE SQLSTRING VARCHAR ( 200 ) ;
  11.    DECLARE C1 CURSOR WITH RETURN FOR S1 ;
  12.    SET SQLSTRING = 'SELECT * FROM EMFLIB.EQCHKTXPF  WHERE EQCHKDT=? AND EQDEPT=? ' ;
  13.    IF TRIM ( CKUSRNM ) <> '' THEN
  14.    SET SQLSTRING = SQLSTRING || ' AND EQOPRT=? ' ;
  15.    END IF ;
  16.    PREPARE S1 FROM SQLSTRING ;   
  17. IF TRIM ( CKUSRNM ) <> '' THEN
  18. OPEN C1 USING CKDATE , CKDEPT , CKUSRNM ;
  19. ELSE
  20. OPEN C1 USING CKDATE , CKDEPT ;
  21. END IF ;
  22. END  
复制代码

这是一个标准的存储过程,如果说是SQL语句是固定的化,那么最简单了.
  1. CREATE PROCEDURE GetCusName()
  2.    RESULT SETS 1
  3.    LANGUAGE SQL
  4. BEGIN
  5.      DECLARE c1 CURSOR WITH RETURN FOR
  6.      SELECT cusnam FROM customer ORDER BY cusnam;
  7.      OPEN c1;
  8. END
复制代码

只需要定义RESULT SETS 返回个数=几个游标
定义一个游标 WITH RETURN ---V5R1才有的好像  ,然后指定SELECT语句,
OPEN即可.
如果是V5R1一下
  1. CREATE PROCEDURE GetCusName()
  2.    RESULT SETS 1
  3.    LANGUAGE SQL
  4. BEGIN
  5.      DECLARE c1 CURSOR FOR SELECT cusnam FROM customer ORDER BY cusnam;
  6.      OPEN c1;
  7.      SET RESULT SETS CURSOR c1;
  8. END;
复制代码

得手动的SET ,如果多个RESULT SET,必须SET RESULT SETS CURSOR C1,C2,C3....;的方式设置返回.

如果SQL语句不固定,那么可以预先PREPARE一个,然后设置sql语句--使用参数式比较方便.
(参数用?作为占位符),然后PRAPARE 这个sql语句,最后OPEN 游标 USING 变量列表来达到语句的赋值.

navigator还不是太熟悉,生成的不能返回存储过程)(!*)*!)@#*!@)*#$
结果用自己写得代码居然可以.

论坛徽章:
0
2 [报告]
发表于 2006-11-23 09:32 |只看该作者
谢谢,很好的参考.

论坛徽章:
0
3 [报告]
发表于 2006-11-23 20:38 |只看该作者
多谢,学习学习,收藏了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP