免费注册 查看新帖 |

Chinaunix

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

db2存储过程实例,请教高手帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-10 09:33 |只看该作者 |倒序浏览
下面是一段伪存储过程的代码,我只是表达了我希望它实现的效果。但是因为对sql存储过程不太了解,希望各位高手帮忙看看该如何写。
数据库是db2/400的,支持sql存储过程
目的是查出一个满足条件的结果集,将结果集返回给调用它的java程序,从而生成一个报表。

代码如下:

CREATE PROCEDURE LYPLIBS.getRpt ( IN CustNo VARCHAR(,
                                  IN DistNo VARCHAR(6),
                                  IN startdate INTEGER,
                                  IN stopdate INTEGER,
                                  OUT l3203 VARCHAR(16),
                                  OUT l1105 VARCHAR(40),
                                  OUT l3205 INTEGER,
                                  OUT l3206 INTEGER,
                                  OUT av1 FLOAT(5),
                                  OUT sum1 INTEGER,
                                  OUT av2 FLOAT(5),
                                  OUT l1809 INTEGER,
                                  OUT l32061 INTEGER )
    RESULT SETS 1
    LANGUAGE SQL
------------------------------------------------------------------------
-- SQL 存储过程
    -- CustNo
    -- DistNo
    -- startdate
    -- stopdate
    -- l3203 品号
    -- l1105 品名
    -- l3205 期间进货量
    -- l3206 期间出货量
    -- av1 平均日出量
    -- sum1 当前库存量
    -- av2 周转天数
    -- l1809 最近出货日
    -- l32061 未出货天数
------------------------------------------------------------------------
P1: BEGIN
    -- 声明变量
    DECLARE l3203_TMP VARCHAR(16) DEFAULT ' ';
    DECLARE l1105_TMP VARCHAR(40) DEFAULT ' ';
    DECLARE l3205_TMP INTEGER DEFAULT 0;
    DECLARE l3206_TMP INTEGER DEFAULT 0;
    DECLARE av1_TMP FLOAT(5) DEFAULT 0;
    DECLARE sum1_TMP INTEGER DEFAULT 0;
    DECLARE av2_TMP FLOAT(5) DEFAULT 0;
    DECLARE l1809_TMP INTEGER DEFAULT 0;
    DECLARE l32061_TMP INTEGER DEFAULT 0;

    -- 声明游标
    --1、求出唯一的品号,期间进货量,期间出货量
    DECLARE cursor1 CURSOR FOR
        select ly3203,ly1105,sum(ly3205/ly1112),sum(ly3206/ly1112)      
        from lyplibs.lyf32,lyplibs.lyf11                                
        where ly3230=ly1120 and ly3203=ly1101 and ly3201>;=startdate and  
                        ly3201<=stopdate and ly3230=CustNo                        
        group by ly3203,ly1105         
                  
        --2、对应该该品号求当前库存量                                         
    DECLARE cursor2 CURSOR FOR
        select ly0201,sum(ly0203/ly1112)                           
        from lyplibs.lyf02,lyplibs.lyf03,lyplibs.lyf11      
        where ly0200=ly0320 and ly0200=ly1120 and ly0201=ly1101 and
        ly0202 = ly0301 and ly0200 = CustNo and and ly1101 = l3203 and ly0323 = 'NM'  
        group by ly0201                 
                           
        --3、对应该品号求最近出货日
    DECLARE cursor3 CURSOR FOR
        select ly1806,max(ly1809)                                          
        from lyplibs.lyf18                                                  
        where ly1840 = CustNo and ly1806 = l3203 and ly1809 >;= startdate and ly1809 <= stopdate
        group by ly1806  

        --4、对应该品号求未出货天数
    DECLARE cursor4 CURSOR FOR
        select ly3203,count(ly3206)                                      
        from lyplibs.lyf32                                               
        where ly3230= CustNo
        and ly3206 = 0  and ly3203 = l3203  and ly3201 >;= startdate and ly3201<= stopdate                                               
        group by ly3203  

    -- 客户机应用程序的游标未关闭
    OPEN cursor1;         
    -- 客户机应用程序的游标未关闭
    OPEN cursor2;
    -- 客户机应用程序的游标未关闭
    OPEN cursor3;
    -- 客户机应用程序的游标未关闭
    OPEN cursor4;
    SET l3203 = l3203_TMP;
    SET l1105 = l1105_TMP;
    SET l3205 = l3205_TMP;
    SET l3206 = l3206_TMP;
    SET av1 = av1_TMP;
    SET sum1 = sum1_TMP;
    SET av2 = av2_TMP;
    SET l1809 = l1809_TMP;
    SET l32061 = l32061_TMP;
END P1

论坛徽章:
0
2 [报告]
发表于 2004-10-10 15:42 |只看该作者

db2存储过程实例,请教高手帮忙

是不是想把 cursor1 到 cursor3 回给用户?
只要将RESULT SET 改为4 同时将cursor属性设为 with return就可以了

论坛徽章:
0
3 [报告]
发表于 2004-10-10 17:08 |只看该作者

db2存储过程实例,请教高手帮忙

楼上的高手,能不能麻烦写个demo教程出来。
没写过存储过程,db2存储过程的书又特别少,不像PL/sql有好多入门的书以及实例。
胡子眉毛一把抓,比较晕。
我是想将查到的N条记录返回出去,这样我的java程序可以获得这些数据,从而可以将这些数据写入excel中。

论坛徽章:
0
4 [报告]
发表于 2004-10-10 18:00 |只看该作者

db2存储过程实例,请教高手帮忙

create procedure TestProcedureQQ(OUT how_many SMALLINT)
dynamic result sets 1
READS SQL DATA
LANGUAGE SQL
BEGIN
  declare c1 cursor with return for select * from customer;
  select count(*) into how_many from customer;  
  open c1;
END

论坛徽章:
0
5 [报告]
发表于 2004-10-11 08:46 |只看该作者

db2存储过程实例,请教高手帮忙

可以结合我的实例写吗?

论坛徽章:
0
6 [报告]
发表于 2004-10-11 12:33 |只看该作者

db2存储过程实例,请教高手帮忙

差不多一个意思啦  你的实例基本已经成形了 就把我上面说的几个地方改一下就行了

论坛徽章:
0
7 [报告]
发表于 2004-10-12 09:18 |只看该作者

db2存储过程实例,请教高手帮忙

楼上的,我的实例成形了?
霍霍,看来我还是蛮有天分的嘛。。

可是我要返回一组结果集,并不只是一个值,而是一组值。

论坛徽章:
0
8 [报告]
发表于 2004-10-12 12:58 |只看该作者

db2存储过程实例,请教高手帮忙

你的一组值是用cursor 返回的 只要把cursor设成with return 并在sp中打开他就可以在应用程序中获得这个cursor的访问了 具体你看例子和说明就明白了

论坛徽章:
0
9 [报告]
发表于 2004-10-12 15:49 |只看该作者

db2存储过程实例,请教高手帮忙

原帖由 "javacool" 发表:
是不是想把 cursor1 到 cursor3 回给用户?
只要将RESULT SET 改为4 同时将cursor属性设为 with return就可以了

我已经按着改了

可是我查出来的记录外面的java程序怎么取呢?另外,是否在select 的时候应该将字段into到某个变量中去?

论坛徽章:
0
10 [报告]
发表于 2004-10-12 16:48 |只看该作者

db2存储过程实例,请教高手帮忙

String procName = "ONE_RESULT_SET";
      String sql = "CALL " + procName + "(?, ?)";
      CallableStatement callStmt = con.prepareCall(sql);

      // set input parameter to median value passed back by OUT_PARAM
      callStmt.setDouble(1, outMedian);

      // register the output parameter
      callStmt.registerOutParameter(2, Types.INTEGER);

      // call the stored procedure
      System.out.println();
      System.out.println("Call stored procedure named " + procName);
      callStmt.execute();

      // retrieve output parameter
      int outErrorCode = callStmt.getInt(2);

      if (outErrorCode == 0)
      {
        System.out.println(procName + " completed successfully";
        ResultSet rs = callStmt.getResultSet();
        fetchAll(rs);

        // close ResultSet
        rs.close();
      }
IBM自己的例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP