- 论坛徽章:
- 0
|
1.外部存储过程--觉得这个比较好,可以挽救封装的比较好的RPG或者CL程序.效率上也是很显著的,
毕竟是Direct IO
绑定CL的,比较简单,SQLRPG的还没搞定,有知道的人告诉我,因为我已经根据参数设定DS,结果还是不行.
- CREATE PROCEDURE EMPLIB.SP_EQCHKLN(
- IN CKDATE CHAR(8),
- IN CKDEPT CHAR(2),
- IN CKUSRNM CHAR(10) )
- RESULT SET 0
- EXTERNAL NAME EMPLIB.EQCHKLNCL
- LANGUAGE CL
- PARAMETER STYLE GENERAL
复制代码
解说:
标准语法CREATE PROCEDURE 库名.存储过程名
参数有 IN OUT INOUT三种类型
参数类型是常规的--可能是DB2默认的,不是太清楚.
指定外部程序名 EMPLIB.EQCHKLNCL--参数3个,也是CKDATE CKDEPT USRNM
指定外部程序使用的语言. 简单吧,只需要把CL稍微封装,我们就可以调用服务器的程序.
或者使用CALL 的方式,但是比较麻烦,个人觉得使用这种方式比较好.
2.SQL存储过程-使用参数形式,预编译
- CREATE PROCEDURE EMPLIB.SP_GETCHKTX (
- IN CKDATE CHAR(8) ,
- IN CKDEPT CHAR(2) ,
- IN CKUSRNM CHAR(10) )
- RESULT SETS 1
- LANGUAGE SQL
- SPECIFIC EMPLIB.SP_GETCHKTX
- READS SQL DATA
- BEGIN
- DECLARE SQLSTRING VARCHAR ( 200 ) ;
- DECLARE C1 CURSOR WITH RETURN FOR S1 ;
- SET SQLSTRING = 'SELECT * FROM EMFLIB.EQCHKTXPF WHERE EQCHKDT=? AND EQDEPT=? ' ;
- IF TRIM ( CKUSRNM ) <> '' THEN
- SET SQLSTRING = SQLSTRING || ' AND EQOPRT=? ' ;
- END IF ;
- PREPARE S1 FROM SQLSTRING ;
- IF TRIM ( CKUSRNM ) <> '' THEN
- OPEN C1 USING CKDATE , CKDEPT , CKUSRNM ;
- ELSE
- OPEN C1 USING CKDATE , CKDEPT ;
- END IF ;
- END
复制代码
这是一个标准的存储过程,如果说是SQL语句是固定的化,那么最简单了.
- CREATE PROCEDURE GetCusName()
- RESULT SETS 1
- LANGUAGE SQL
- BEGIN
- DECLARE c1 CURSOR WITH RETURN FOR
- SELECT cusnam FROM customer ORDER BY cusnam;
- OPEN c1;
- END
复制代码
只需要定义RESULT SETS 返回个数=几个游标
定义一个游标 WITH RETURN ---V5R1才有的好像 ,然后指定SELECT语句,
OPEN即可.
如果是V5R1一下
- CREATE PROCEDURE GetCusName()
- RESULT SETS 1
- LANGUAGE SQL
- BEGIN
- DECLARE c1 CURSOR FOR SELECT cusnam FROM customer ORDER BY cusnam;
- OPEN c1;
- SET RESULT SETS CURSOR c1;
- END;
复制代码
得手动的SET ,如果多个RESULT SET,必须SET RESULT SETS CURSOR C1,C2,C3....;的方式设置返回.
如果SQL语句不固定,那么可以预先PREPARE一个,然后设置sql语句--使用参数式比较方便.
(参数用?作为占位符),然后PRAPARE 这个sql语句,最后OPEN 游标 USING 变量列表来达到语句的赋值.
navigator还不是太熟悉,生成的不能返回存储过程)(!*)*!)@#*!@)*#$
结果用自己写得代码居然可以. |
|