一、oracal存储过程
以 pkg_oms_web_maintain_iteminfo.web_pr_query_item 为例
//包名 pkg_oms_web_maintain_iteminfo
//存储过程名 packge bo
dies中有其具体的实现 web_pr_query_ite
参数类型
参数类型 | 描述 | 数据类型 | 是否必需 | 说明 |
IN | 输入参数,传递给存储过程的值 | 支持所有 Oracle 数据类型 | 是 | 参数值在过程中不可被修改。 |
OUT | 输出参数,存储过程返回的结果 | 支持所有 Oracle 数据类型 | 否 | 需要在过程中赋值,否则会引发异常。 |
IN OUT | 双向参数,接收输入值并返回输出值。 | 支持所有 Oracle 数据类型。 | 否 | 可以在存储过程中读取和修改,调用时也可以传入初始值。 |
二、通过mybatis调用
以查询商品信息web_pr_query_ite为例
procedure web_pr_query_item( ls_branchno in char, ls_item_no in varchar2, ls_viptype in varchar2, iteminfo_cur out kmcur, itemstockprices_cur out kmcur3, itemextinsurances out kmcur4, ls_resultcode out char, ls_resultmsg out varchar2);
map传参
当只有in参数或者out参数为String这种类型的时候使用map带参方便
mapper层定义
注意:
1.参数的传值通过map的key-value,key名称最好和存储过程的名称一致,或基于xml的映射规则,
如ls_branchno->对应lsBranchno
2.唤起存储过程是返回void,查询的结果通过游标写入传入的参数rs中,如果已有key,会覆盖,没有新建。
3.out参数的course类型只能用resultMap来接,可以不写具体映射,指定type就行
@Select("{CALL pkg_oms_web_maintain_iteminfo.web_pr_query_item(" + "#{branchNo, mode=IN, jdbcType=CHAR}, " + "#{itemNo, mode=IN, jdbcType=VARCHAR}, " + "#{vipType, mode=IN, jdbcType=VARCHAR}, " + "#{iteminfoCur, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet,resultMap=iteminfoCur}, " + "#{itemstockpricesCur, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet,resultMap=itemstockpricesCur}, " + "#{itemextinsurances, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet,resultMap=itemextinsurances}, " + "#{ls_resultcode, mode=OUT, jdbcType=CHAR}, " + "#{ls_resultmsg, mode=OUT, jdbcType=VARCHAR})" + "}") @Options(statementType = StatementType.CALLABLE) void webPrQueryItem(ItemInfoResp itemInfoResp);
xml:
<resultMap id="itemstockpricesCur" type="com.sundan.pos.modules.goods.model.vo.iteminfo.ItemStockPrice"> </resultMap> <resultMap id="iteminfoCur" type="com.sundan.pos.modules.goods.model.vo.iteminfo.ItemInfo"> </resultMap> <resultMap id="itemextinsurances" type="com.sundan.pos.modules.goods.model.vo.iteminfo.ItemExtInsurance"> </resultMap>
service:
public String getItemInfo(String branchNo, String itemNo, String vipType, String jdeServiceUrl, String imgServiceUrl, String sheetType) { ArrayList<ItemInfo> itemInfos = new ArrayList<>(); ArrayList<ItemStockPrice> itemStockPrices= new ArrayList<>(); ArrayList<ItemExtInsurance> itemExtInsurances = new ArrayList<>(); Map<String, Object> rs= new HashMap<>(); rs.put("ls_branchno", branchNo); rs.put("ls_item_no", itemNo); rs.put("ls_viptype", vipType); rs.put("iteminfoCur", itemInfos); rs.put("itemstockpricesCur", itemStockPrices); rs.put("itemextinsurances", itemExtInsurances); rs.put("ls_resultcode", null); rs.put("ls_resultmsg", null); this.baseMapper.webPrQueryItem(rs); return JSON.toJSONString(rs); }
对象传参
直接使用对象作为resVO和respVO
public class ItemInfoResp { private String branchNo; private String itemNo; private String vipType; private List<ItemInfo> iteminfoCur; private List<ItemStockPrice> itemstockpricesCur; private List<ItemExtInsuranceVO> itemextinsurances; private String ls_resultcode; private String ls_resultmsg; }
service:
mapper和xml与之前一致,只需要保持实体按mybatis默认的映射规则能映射到存储过程的参数就行
public ItemInfoResp getItemInfo(String branchNo, String itemNo, String vipType, String jdeServiceUrl, String imgServiceUrl, String sheetType) { ItemInfoResp resp = new ItemInfoResp(); resp.setBranchNo(branchNo); resp.setItemNo(itemNo); resp.setVipType(vipType); this.baseMapper.webPrQueryItem(resp); return resp; }
三、调试存储过程
选中对应存储过程,右键测试
输入变量值调试结果,通过断点查看堆栈情况