锁定老帖子 主题:项目中的一个问题--返回游标结果集
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | |||||||||||||||||||||||||||||||||||||||
发表时间:2010-06-20
最后修改:2010-06-20
几句题外话: 现在越来越觉得数据库的重要作用,程序只是实现这样或那样的业务过程,没有数据库的支撑,程序再怎么写都是鸡肋,特别是大型互联网的应用,数据库绝对是一个重要的方面。
该表存储的是商品的相关信息。
该表存储的是商品的定价信息,即将商品信息表productInfo的商品重新修订价格之后,会将修改的价格信息存储在该表中。
该表存储的是某类商品的整体定价,例如将商品类型productType=10001的商品整体调整价格,使价格统一上浮100元,这种整体价格调整信息将存储在该表中。 给大家参考的同时也盼望大家看看有没有什么问题呢? create or replace package package_productprice is -- Author : hnylj type resultList is ref cursor; procedure processProductPrice(p_userid in varchar2, p_productType in varchar2, p_pageIndex in number, p_pageEnd in number, productList out resultList); end package_productprice; create or replace package body package_productprice is procedure processProductPrice(p_userid in varchar2, p_productType in varchar2, p_pageIndex in number, p_pageEnd in number, productList out resultList) is --商品整体定价(上浮的钱数) v_productUnityPrice number(8, 2) := 0.00; --判断是否有整体定价 v_count number(1) := 0; begin --查询是否有商品的整体定价 select count(*) into v_count from PRODOCTUNITYPRICING a where a.userid = p_userid and a.producttype = p_productType; --如果不存在整体定价 if v_count = 0 then --查询商品表和商品定价表 open productList for SELECT * FROM (SELECT AA.*, ROWNUM RN FROM (select t.*, p.productPricing from (select a.productid productId, a.productname productName, decode(a.productprice, null, 0.00, a.productprice) productPrice, a.producttype productType from productinfo a where a.producttype = p_productType) t, (select b.productid productId, decode(b.PRODUCPRICING, null, 0.00, b.PRODUCPRICING) productPricing from productpricing b where b.producttype = p_productType and b.userid = p_userid) p where t.productId = p.productId(+) order by t.productPrice) AA WHERE ROWNUM <= p_pageEnd) WHERE RN >= p_pageIndex; end if; --如果存在整体定价 if v_count > 0 then --查询出整体定价上浮的钱数存入v_productUnityPrice变量 select decode(a.unitypricing, null, 0, a.unitypricing) into v_productUnityPrice from PRODOCTUNITYPRICING a where a.userid = p_userid and a.producttype = p_productType; --查询商品表和商品定价表 open productList for SELECT * FROM (SELECT AA.*, ROWNUM RN FROM (select t.*, decode(p.productPricing, null, t.productPrice+v_productUnityPrice, p.productPricing) productPricing from (select a.productid productId, a.productname productName, decode(a.productprice, null, 0.00, a.productprice) productPrice, a.producttype productType from productinfo a where a.producttype = p_productType) t, (select b.productid productId, decode(b.PRODUCPRICING, null, 0.00, b.PRODUCPRICING) productPricing from productpricing b where b.producttype = p_productType and b.userid = p_userid) p where t.productId = p.productId(+) order by t.productPrice) AA WHERE ROWNUM <= p_pageEnd) WHERE RN >= p_pageIndex; --循环游标开始 end if; end processProductPrice; end package_productprice; 存储过程代码如上,使用的动态游标ref cursor。
下面是一段java调用该存储过程的测试代码: package com.javaeye.hnylj.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.javaeye.hnylj.model.ProductInfo; /** * 测试存储过程 * * @since Jun 20, 2010 */ public class ProceduresTest { private Connection conn = null; private CallableStatement cstmt = null; private ResultSet rs = null; private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:workdb"; private static final String USERNAME = "framework"; private static final String PASSWORD = "framework"; private List<ProductInfo> list; /** * 数据库连接 * * @return Connection */ public synchronized Connection getConnection() { try { Class.forName(DRIVER); conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } catch (SQLException e) { e.printStackTrace(); return null; } return conn; } /** * 调用存储过程得到游标数据集 * * @return */ public List<ProductInfo> queryList() { list = new ArrayList<ProductInfo>(); try { if (this.getConnection() != null) { conn = this.getConnection(); cstmt = conn.prepareCall("{call package_productprice.processProductPrice(?,?,?,?,?)}"); cstmt.setString(1, "0001"); cstmt.setString(2, "10001"); cstmt.setInt(3, 1); cstmt.setInt(4, 10); cstmt.registerOutParameter(5, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet)cstmt.getObject(5); while (rs.next()) { ProductInfo productInfo = new ProductInfo(); productInfo.setProductId(rs.getString(1)); productInfo.setProductName(rs.getString(2)); productInfo.setProductPrice(rs.getDouble(3)); productInfo.setProductType(rs.getString(4)); productInfo.setProductPricing(rs.getDouble(5)); list.add(productInfo); } } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (null != rs) { rs.close(); } if (null != cstmt) { cstmt.close(); } if (null != conn) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return list; } /** * main方法测试 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { ProceduresTest test = new ProceduresTest(); List<ProductInfo> productList = test.queryList(); for (ProductInfo productInfo : productList) { System.out.println(productInfo.getProductId()); System.out.println(productInfo.getProductName()); System.out.println(productInfo.getProductPrice()); System.out.println(productInfo.getProductPricing()); System.out.println(productInfo.getProductType()); } } } 另外还需要一个model类ProductInfo,该类的代码只要productId、productName、productPrice、productPricing、productType及相应的getter和setter方法。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||
浏览 3389 次