当前位置:首页 > 开发 > 数据库 > 正文

Oracle + mybatis 调用存储过程遇到的问题

发表于: 2015-02-06   作者:chenyi84   来源:转载   浏览次数:
摘要: 我程序预期是调用存储过程执行Update操作,表名需要传参数拼 最终版代码: mapping.xml部分代码: <select id="updateBrandAByBrand" statementType="STATEMENT"> <![CDATA[ {call BRAND_${_parameter}('${

我程序预期是调用存储过程执行Update操作,表名需要传参数拼

最终版代码:

mapping.xml部分代码:

<select id="updateBrandAByBrand" statementType="STATEMENT">
  	<![CDATA[
        {call BRAND_${_parameter}('${_parameter}')}]]>
 </select>

 存储过程部分代码:

CREATE OR REPLACE PROCEDURE BRAND_A0101(tabname IN VARCHAR2) AS 
v_sql VARCHAR2(300);
BEGIN 
  v_sql:='update T_EXTERNAL_PRODS_TEMP_'||tabname||'_2 set BRANDNAME_A = TRIM(REPLACE(BRANDNAME,'' '','' '')) where BRANDNAME is not null';
  EXECUTE IMMEDIATE v_sql;
 -- EXEC BRAND_A0101(v_num);
END BRAND_A0101;

 就为拼T_EXTERNAL_PRODS_TEMP_A0101_2这个表名,直接写 Update 拼表名貌似数据库会报错,需要转成字符串在执行,同时遇到第二个问题 后面单引号,解决的方式是2个单引号代表1个单引号转义 其实还可以用 char(39),  select char(39)  结果也是 ‘

 

这样理解吧:
1、''是字符界定符,告诉SQL你输入的是字符,SQL已经知道@sitemtext是字符类型,所以不需要。
2、LIKE '%XXX%' 可以拆分为 '%' + 'XXX' + '%','XXX' = @sitemtext。
3、EXEC执行字符串:@sitemtext对于EXEC来说变量,但对于EXEC内部的字串指令来说,它是常量,在运行EXEC之前,@sitemtext必然有个确定值(比如@sitemtext='TEST'),如果用1点代替3点,则变成“……NID = TEST……”,那字串指令将TEST解析为对象名。
4、道理同上。

比较笨的方法(也是避免错误的最佳方法):
A、全部先不加点:
    exec (declare mycursor cursor for select top @maxitems SID,NID,NTime from (select top @mycount * from V_PC_DOWNUPDATE where BName like '%@sitemtext+%') as MyTable order by NTime desc)
B、加首尾两点:
    exec ('declare mycursor cursor for select top @maxitems SID,NID,NTime from (select top @mycount * from V_PC_DOWNUPDATE where BName like '%@sitemtext+%') as MyTable order by NTime desc')
C、给字串指令解析为数字的变量加1点:
    exec ('declare mycursor cursor for select top ' + @maxitems + ' SID,NID,NTime from (select top ' + @mycount + ' * from V_PC_DOWNUPDATE where BName like '%@sitemtext+%') as MyTable order by NTime desc')
C、给字串指令解析为字符的变量加3点:
    exec ('declare mycursor cursor for select top ' + @maxitems + ' SID,NID,NTime from (select top ' + @mycount + ' * from V_PC_DOWNUPDATE where BName like ''%' + @sitemtext + '%'') as MyTable order by NTime desc')
D、检查在()里面,除了变量和“+”号,全部变成红色。多写你就会很熟练,直接写出来都可以了,不用那么麻烦。

Oracle + mybatis 调用存储过程遇到的问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
看了下mybatis源码,有调用存储过程的例子,整理下。 参数形式: create procedure sptest.adder(in
Oracle调用存储过程 pl/sql执行: SQL窗口: call procedure_name(parameter); begin procedure_name
“皇上,还记得当年大三时认识的存储过程吗?” “朕记得,就是。。。” 今天咱们练练存储过程。如
本文主要是总结 如何实现 JDBC调用Oracle的存储过程,从以下情况分别介绍: [1]、只有输入IN参数,
为了测试这个存储过程,我遥了一圈去做这个事情,这里说一下我自己接受到任务和自己开始是怎么想的
  在linux环境中用php查询sql server并不是很常见的需求.一般来说如果一定要用sql server,编程语
ibatis 配置调用存储过程,jdbctype配置 数据库存储过程如下: procedure p_project_details_stat (
ibatis: 如下: xml配置文件: 请看mybatis: 如下: xml配置文件: 参考 oracle存储过程 这里可以
创建有参存储函数findEmpNameAndSal(编号),查询7902号员工的的姓名和月薪,【返回多个值,演示out
----创建的存储过程 create or replace procedure addTest(v1 in number, v2 in number,res out num
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号