Oracle创建存储过程及在Mybatis中的调用

原创 2017年07月17日 17:00:23

1.需求说明

系统中多个业务ID生成规则为:固定前缀+顺序号,考虑到可能删除和顺序号到头的原因,因此需要一个存储过程,查找出可用的顺序号

2.存储过程

--生成cno的规则
--cno_pre:前缀,即非顺序号的部分
--table_name:表名
--col_name:CNO字段名
--suf_length:顺序号长度
--min_use_cno:返回的最小可用值
create or replace procedure cpa_noacct_cno_create_pro(cno_pre     in varchar,
                                                      table_name  in varchar,
                                                      col_name    in varchar,
                                                      suf_length  in number,
                                                      min_use_cno out varchar) as
  sel_sql varchar(1000);

begin
  for i in 1 .. power(10, suf_length) - 1 loop
    insert into CPA_ID_CREATE_TAB values (lpad(i, suf_length, '0'));
  end loop;
  sel_sql := 'select min(t.id) from (select id from CPA_ID_CREATE_TAB';
  sel_sql := sel_sql || ' minus select substr(t.' || col_name || ',-' ||
             suf_length || ') id ';
  sel_sql := sel_sql || ' from cpa_noacct t where t.' || col_name ||
             ' like ''' || cno_pre;
  sel_sql := sel_sql || '''||' || '''' || '%' || '''' || ') t';
  dbms_output.put_line(sel_sql);
  EXECUTE IMMEDIATE sel_sql
    into min_use_cno;
end cpa_noacct_cno_create_pro;


如上,其中犯错的地方是:

1.在procedure后的参数,不需要指定长度
2.Oracle的幂函数为power(x,y),意为x的y次方
3.单引号的转义,第一个和最后一个单引号是原始的单引号,第二个是用作转义符,第三个被转义
select '''' from dual
4.把字符串当做sql执行要用EXECUTE IMMEDIATE,在sql字符串中不要有 into 变量.而在EXECUTE IMMEDIATE后使用into 变量
5.左补零函数为lpad(字段名,要求长度,当长度不够时用来补充的字符)
6.dbms_output是有长度限制的,可以在plsql的中进行设置
7.求差集,用minus
8.临时表的创建
CREATE GLOBAL TEMPORARY TABLE T_TEST

(
    ID VARCHAR2(32),

    NAME VARCHAR2(32)

) ON COMMIT DELETE ROWS;


3.在mybatis中的调用

代码如下

在xml中
	<!--生成cno-->
	<select id="getMinCno" statementType="CALLABLE" parameterType="java.util.HashMap" resultType="java.util.Map">
		<![CDATA[
		{call cpa_noacct_cno_create_pro
		(#{pre,mode=IN,jdbcType=VARCHAR},
		 #{tableName,mode=IN,jdbcType=VARCHAR},
		 #{colName,mode=IN,jdbcType=VARCHAR},
		 #{length,mode=IN,jdbcType=INTEGER},
		 #{minCno,mode=OUT,jdbcType=VARCHAR})}
       ]]>
	</select>

注意:
1.要指定mode为IN或者OUT
2.如果存储过程中返回值用OUT,则直接使用用来传递参数的MAP进行接收
3.如果使用return,则需要指定返回值.如#{res,mode=OUT,jdbcType=VARCHAR}={}
4.在call外层要使用{}包裹

调用示例

Map<String,String> params = new HashMap<String, String>();
		params.put("pre","14040121t");
		params.put("tableName","cpa_noacct");
		params.put("colName","nocpa_Cno");
		params.put("length","3");
		params.put("minCno","-1");
		cpaCpafAppServiceImpl.test(params);
		System.out.println(params);

总结:

1.对mybatis调用存储过程不熟练,上网找了好多,都是讲了用法,没有讲遇到的问题
2.oracle的存储过程不熟练,一边查资料,一边写
3.粗心大意


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30682027/article/details/75256160

mybatis调用oracle存储过程返回结果集

存储过程: CREATE OR REPLACE procedure P_TEST(v_cursor OUT sys_refcursor) as begin OPEN v_cursor FOR s...
  • eunyeon
  • eunyeon
  • 2016-10-06 20:21:57
  • 3329

mybatis调用存储过程

记两一下工作中用到的mybatis调用存储过程,这边用到的mybatis是3.2.2版本,oracle 10g。 一、返回一个值的存储过程,如下: CREATE OR REPLACE PROCEDUR...
  • wangchangpen62
  • wangchangpen62
  • 2015-04-09 16:36:50
  • 10244

Mybatis调用Oracle带包存储过程

存储过程太多的情况可分包存储。方便查找些。 1.建带包存储过程: oracle中找到包右键新建,代码可参考以下 create or replace package PKG_A_LOG(包名...
  • banjf
  • banjf
  • 2016-03-14 15:10:25
  • 1838

Mybatis 调用oracle存储过程返回结果集

1.这里我是直接接http://blog.csdn.net/shen525758203/article/details/32331229
  • SHEN525758203
  • SHEN525758203
  • 2014-06-20 15:51:53
  • 3202

mybatis3调用oracle存储过程

oracle的存储过程,如果要查询数据必须有一个游标供使用  先看下简单的存储过程    Sql代码   CREATE OR REPLACE PROCEDURE zdrqlx_PROC ...
  • HUXU981598436
  • HUXU981598436
  • 2013-12-23 10:18:47
  • 2995

Mybatis传list参数调用oracle存储过程

怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据? MyBatis中参数是List类型时怎么处理?大家都知道MyBatis批处理大量数据是很难做到事务回滚的(事务由...
  • qq_32078397
  • qq_32078397
  • 2017-03-10 12:57:04
  • 614

MyBatis调用Oracle存储过程

一.建立存储过程(带输入,输出参数的存储过程( 根据员工编号查询 工资 )) create or replace procedure proinout (--参数 v_eno in emp.empno...
  • SVDJASFHIAU
  • SVDJASFHIAU
  • 2016-05-10 22:47:34
  • 299

mybatis 调用oracle存储过程,传参、返回游标的值获取--示例

1,dao层代码 Map map = new HashMap(); map.put("zsxxdm", zsxxdm); map.put("students", students); ...
  • wolongsuxing
  • wolongsuxing
  • 2014-09-12 10:33:32
  • 1937

mybatis调用oracle存储过程-传入多个参数返回结果集

mybatis.xml配置:                                                                    ...
  • s592652578
  • s592652578
  • 2016-03-03 18:49:12
  • 1648

mybatis 调用oracle 存储过程并返回结果集

1. xml文件 {call cassify_massive_water_bill( #{startMonth,mode=IN}, ...
  • milaoshubuku
  • milaoshubuku
  • 2017-04-17 16:19:58
  • 537
收藏助手
不良信息举报
您举报文章:Oracle创建存储过程及在Mybatis中的调用
举报原因:
原因补充:

(最多只允许输入30个字)