接触oracle存储过程

这是我写的第一个存储过程:

CREATE OR REPLACE PROCEDURE STATE_SALE(BOOK_ID   IN VARCHAR2,
                                       STORE_ID_IN  IN VARCHAR2,
                                       MAOLI_OUT   OUT NUMBER) IS
  SALED_NUM NUMBER; --出售量
  ONSALE_UP_TIME DATE; --图书上架时间
  INITIAL_NUM NUMBER; --上架库存数量
  FINAL_PRICE_UP NUMBER; --上架时的进价
  INTO_STOCK_PRICE NUMBER; --入库时的进价
  ROOM_STOCK_NUM NUMBER; --库存入库数
  ROOM_STOCK_TIME DATE; --库存入库时间
  FINAL_PRICE_V NUMBER; --最终交易价格
  IS_NUM NUMBER; --判断标记
  MY_NUM NUMBER; --暂时库存数
  MAOLI_RESULT NUMBER; --毛利和
  SALE_COST NUMBER; --销售成本
  SALE_EARNING NUMBER; --销售收入(实洋)

  BEGIN

SELECT TTT.ONSALE_TIME, TTT.PURCHASINGPRICE INTO ONSALE_UP_TIME, FINAL_PRICE_UP FROM TBL_STORE_BOOKINF TTT WHERE TTT.PK_BOOKINFO_ISBN_ID = BOOK_ID AND TTT.STORE_ID = STORE_ID_IN;
IF BOOK_ID IS NOT NULL THEN
SELECT COUNT(AA.BOUGHT_NUM), AA.FINAL_PRICE INTO SALED_NUM, FINAL_PRICE_V FROM TBL_ORDER_HISTORY_DTL AA WHERE AA.GOODS_ID = BOOK_ID GROUP BY AA.GOODS_ID,AA.FINAL_PRICE;
SELECT SM.INITIAL_NUM INTO INITIAL_NUM FROM TBL_STOCK_MANAGE SM WHERE SM.STORE_ID=STORE_ID_IN AND SM.PK_BOOK_ID=BOOK_ID;
END IF ;

  --获得销售收入(实洋)
SALE_EARNING := SALED_NUM * FINAL_PRICE_V;

  --如果上架时的库存已经能够满足出售量时
IF SALED_NUM < INITIAL_NUM THEN
  --计算毛利
SALE_COST := FINAL_PRICE_UP * SALED_NUM; MAOLI_RESULT := FINAL_PRICE_V * SALED_NUM - SALE_COST;
ELSE
--销售剩余数量差----销售数量-上架时的库存数
IS_NUM := SALED_NUM - INITIAL_NUM;
--如果库存数小于0

WHILE IS_NUM > 0 LOOP
BEGIN
SELECT TTTT.ENTER_STOCK_TIME 入库时间, TTTT.ENTER_STOCK_NUM 入库数, TTTT.INIT_PRICE 进价 INTO ROOM_STOCK_TIME, ROOM_STOCK_NUM, INTO_STOCK_PRICE FROM TBL_ENTER_STOCK TTTT WHERE TTTT.STORE_ID = STORE_ID_IN AND TTTT.Book_Id = BOOK_ID ORDER BY TTTT.ENTER_STOCK_TIME;
--库存入库数-   当前库存数量-
MY_NUM := ROOM_STOCK_NUM - IS_NUM;
--计算毛利
IF MY_NUM < 0 THEN
BEGIN
  --销售收入
SALE_COST := SALE_COST + INTO_STOCK_PRICE * ROOM_STOCK_NUM;
END; ELSE
--销售收入
SALE_COST := SALE_COST + INTO_STOCK_PRICE * ROOM_STOCK_NUM;

END IF; SALE_COST := SALE_COST + INTO_STOCK_PRICE * SALED_NUM;
END;
END LOOP;
END IF;
IF MAOLI_RESULT=NULL THEN
MAOLI_RESULT := SALE_EARNING - SALE_COST;
END IF;
MAOLI_OUT := MAOLI_RESULT; --把毛利结果赋值给毛利
END STATE_SALE;

 

因为项目的原因接触了存储过程,在我看来高深的存储过程终于自己也可以简单地学习了.

存储过程,用sq/plus还能进行数据测试:

写完存储过程后,就可以在图片pre.jsp附件中,右击可以进行测试,添加上测试数据就可以进行单步测试了.和eclipse测试一样.这样就可以测试你写的存储过程是否正确

 

 

在service层调用:

getHibernateTemplate().execute(new HibernateCallback()
  {
   @SuppressWarnings("deprecation")
   public Object doInHibernate(Session session)
     throws HibernateException, SQLException
   {
    CallableStatement cs = session.connection().prepareCall(
      "{call STATE_SALE(?,?,?)}");//不管是in参数还是out参数都要加?
    cs.setString(1, bookId);// 图书编号
    cs.setString(2, storeId);// 店铺ID
    //cs.registerOutParameter(3, Types.VARBINARY, "MAOLI_OUT");
    cs.registerOutParameter(3,Types.BIGINT);
    cs.execute();
    String testPrint =cs.getString(3);
    System.out.println(testPrint);
    // 毛利
    final Long maoli = Long.parseLong(testPrint);
    return maoli;
   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值