上次的项目,要求我用java代码调用存储过程,折腾了好久。最后总算成功了。发片帖子纪念下,也给不懂存储过程的但是要调用的人一些提示
首先介绍下存储过程(本人是不会写的,但是目前能看懂)
create or replace procedure P_DAP_UNI_CUBE_INFO(V_CUBE_NAME IN VARCHAR2, --每个参数都有三部分 形参 in/out 类型, in是入参 ,out是返回的参数
V_TABLE_NAME IN VARCHAR2,
V_RETCODE OUT VARCHAR2,
V_RETINFO OUT VARCHAR2) is /看括号里面的参数
/*
************************************************************************* 后面不用看了我就粘了一半,反正不是我写的
*名 称 --%@NAME: P_DAP_UNI_CUBE_INFO
*功能描述 --%@COMMENT:
*执行周期 --%@PERIOD:
*参 数 --%@PARAM:ACCT_MONTH 帐期 YYMMDD
*参 数 --%@PARAM:V_RETCODE 过程执行结果代码(成功:SUCCESS/失败:FAIL/等待:WAIT),输出参数
*参 数 --%@PARAM:V_RETINFO 过程执行结果描述,输出参数
*创 建 人 --%@CREATOR:
*创建时间 --%@CREATED_TIME: 2018-3-12
*备 注 --%@REMARK:
*修改记录 --%@MODIFY: 修改人 YYYYMMDD 修改内容
*来 源 表 --%@FROM:
*目 标 表 --%@TO:
**************************************************************************
*/
V_PROV_ID VARCHAR2(3);
V_PKG VARCHAR2(40);
V_PROCNAME VARCHAR2(50);
V_ROWLINE NUMBER := 0; -- 记录目标表数据变化记录数
V_CUBE_ID VARCHAR2(100);
V_FILEDATE VARCHAR2(100);
上面就是数据库里已经存在的 存储过程了。有4个参数,前两个是输入,后两个是输出。假如直接从plsql调用,可以这么写
然后点旁边的输出就能看到结果;
你需要在plsql能调用成功的情况下才能使用代码调用
用mybatis调用时候的xml文件
大概就是select标签里面 call 存储过程名(参数1,参数2,参数3……)
虽然写了四个参数,但是其实你传过来的map只需要封装入参(就是mode=in)的就好了
mapper层
// 执行 存储过程
public int addCubeSqlMap(Map sql);
String cubeName = "第一个入参"; String factTableName = "第二个入参"; Map,String > parm = new HashMap ,String>(); parm.put("V_CUBE_NAME",cubeName); parm.put("V_TABLE_NAME",factTableName); evapMapper.addCubeSqlMap(parm);
反正在map里面放入两个入参,传过去就能执行储存过程。
我当时不需要存储过程的返回值就没有取,如果要取存储过程的返回值直接用这个map去get就拿到了假设我要取这个过程的参数应该这么写
evapMapper.addCubeSqlMap(parm); //接着上面的代码
parm.get("V_RETCODE"); //直接get你要传入xml的map get mode=out 的那个参数名就拿到了存储过程给你返回的值……是不是很奇妙
parm.get(" V_RETINFO");
---------------------------------分隔线
当时遇到的一个错误,贴出来警告自己,为什么那么蠢