这是我写的第一个存储过程:
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;
}