免费注册 查看新帖 |

Chinaunix

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

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

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

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

-- 声明游标
DECLARE cursor1 CURSOR WITH RETURN 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 ;(这边要逗号的)

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

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

DECLARE cursor2 CURSOR WITH RETURN FOR
        select 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;
2句declare cursor后面我都加了;

LYPLIBS.getrpt1 ― 构建已启动。

DROP SPECIFIC PROCEDURE LYPLIBS.GETRPT1

LYPLIBS.getrpt1 ― 删除 存储过程 完成。

[SQL0104] Token ; was not valid. Valid tokens: ( WITH SELECT <IDENTIFIER>;.

LYPLIBS.getrpt1 ― 构建失败。

LYPLIBS.getrpt1 ― 回滚成功完成。

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

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

DECLARE cursor2 CURSOR WITH RETURN FOR
        select 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;
2句declare cursor后面我都加了;

LYPLIBS.getrpt1 ― 构建已启动。

DROP SPECIFIC PROCEDURE LYPLIBS.GETRPT1

LYPLIBS.getrpt1 ― 删除 存储过程 完成。

[SQL0104] Token ; was not valid. Valid tokens: ( WITH SELECT <IDENTIFIER>;.

LYPLIBS.getrpt1 ― 构建失败。

LYPLIBS.getrpt1 ― 回滚成功完成。

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

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

没问题啊 我用你的例子建了一遍 处;除了cursor中的语句不同以外 别的都一样 生成成功拉 下面是例子
CREATE PROCEDURE getrpt1 ( IN custno VARCHAR(16),
IN startdate INTEGER,
IN stopdate INTEGER,
OUT l3203 VARCHAR(16),
OUT l1105 VARCHAR(40),
OUT l3205 DECIMAL(10,2),
OUT l3206 DECIMAL(10,2),
OUT l0203 DECIMAL(10,2))
RESULT SETS 2
LANGUAGE SQL
------------------------------------------------------------------------
-- SQL 存储过程
-- custno 客户代号
-- startdate 初始日期
-- stopdate 结束日期
-- l3203 品号
-- l1105 品名
-- l3205 期间进货量
-- l3206 期间出货量
------------------------------------------------------------------------
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 l0203_TMP FLOAT(5) DEFAULT 0;

-- 声明游标
  declare c1 cursor with return for select * from testcursor;
  declare c2 cursor with return for select * from goods;

OPEN c1;
open c2;
SET l0203 = l0203_TMP;
SET l3203 = l3203_TMP;
SET l1105 = l1105_TMP;
SET l3205 = l3205_TMP;
SET l3206 = l3206_TMP;

END P1

你最好看看SQL有没有什么问题

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

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

我也重建了一次,可以运行了。
不过问题在于,第二个cursor的结果集没有出现,出现的结果只是第一个查出来的记录,也就是4个字段的结果集,少二个字段。

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

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

那是你的java程序的问题 下面是处理多结果集的代码 跟上次给你的差不多 try
    {
      // prepare the CALL statement for TWO_RESULT_SETS
      String procName = "TWO_RESULT_SETS";
      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";

        System.out.println(
          "Result set 1: Employees who make more than " + outMedian);
        // get first result set
        ResultSet rs = callStmt.getResultSet();
        fetchAll(rs);

        System.out.println();
        System.out.println("Result set 2: Employees who make less than " +
                           outMedian);
        // get second result set
        callStmt.getMoreResults();
        rs = callStmt.getResultSet();
        fetchAll(rs);

        // close ResultSet
        rs.close();
      }

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

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

不是的,我是设置输入参数后直接运行这个存储过程,没有用java程序调用。

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

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

我试了 可以返回两个结果集啊  这是我的例子直接调用SP产生的结果

D:\zhang>;db2 call getrpt1('11',2,3,?,?,?,?,?)
  输出参数的值
  --------------------------
  参数名: L3203
  参数值:

  参数名: L1105
  参数值:

  参数名: L3205
  参数值:  0.00

  参数名: L3206
  参数值:  0.00

  参数名: L0203
  参数值:  0.00


  结果集 1
  --------------

  NUM         NAME
  ----------- --------------------
          122 zhang
          990 zhang
          105 zhang
          122 zhang
          109 zhang
          350 zhang
          128 gng

  7 条记录已选择。


  结果集 2
  --------------

  GROUP       NAME
  ----------- --------------------
            1 A1
            1 A2
            1 A3
            1 A4
            1 A5

  5 条记录已选择。

  返回状态 = 0

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

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

咦,你的2个sql句子返回的记录数怎么不一样的。
我的2个sql句子返回的记录是一一对应的。
第1个查询查出来的“号码”字段作为第2个查询查到的“数量”字段的条件。
存储过程是这样写的吗?

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

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

我不是说了吗 我的cursor后面接的SQL跟你的不一样 是我加上去得
如果你还有错的话 最好查查你的SQL是不是写的对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP