【问题标题】:Calling pl/sql function with mybatis 3用mybatis 3调用pl/sql函数
【发布时间】:2013-05-31 14:00:38
【问题描述】:

我有一个在 pl/sql 中返回布尔值的函数。我试过 直接获取该布尔值而没有成功,所以现在我正在尝试将其转换为字符串(我不想修改数据库):

<parameterMap id="publicObject"   type="map">
<parameter javaType="java.lang.Object" jdbcType="VARCHAR" mode="OUT" property="result" /> 
<parameter javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" property="id" /> 
</parameterMap>     

<select id="isPublicObject" parameterMap="publicObject" statementType="CALLABLE">

   <![CDATA[
    {
    declare
    v_bool BOOLEAN := TRUE;
    begin
    v_bool := PACKNAME.STF$IS_PUBLIC_OBJECT(#{id});
    #{result} := CASE WHEN v_bool THEN 'TRUE' ELSE 'FALSE' END;
    end;
    }
    ]]>

</select>

然后我得到这个异常: “查询数据库时出错。原因:org.apache.ibatis.type.TypeException:使用 JdbcType OTHER 为参数 #2 设置 null 时出错。尝试为此参数设置不同的 JdbcType 或不同的 jdbcTypeForNull 配置属性。原因:java.sql.SQLException :无效的列类型:1111 ####

此代码在数据库中正常工作:

declare
    v_bool BOOLEAN := TRUE;
    v_str  VARCHAR2(5);
begin
   v_bool := PACKNAME.STF$IS_PUBLIC_OBJECT('000000');
   v_str := CASE WHEN v_bool THEN 'TRUE' ELSE 'FALSE' END;
   dbms_output.put_line('result:');
   dbms_output.put_line(v_str); 
end;

【问题讨论】:

标签: oracle plsql mybatis


【解决方案1】:

我写了parameterTypeMap 的例子。它适用于我的测试数据。

XML:

<update id="isPublicObject" parameterType="map" statementType="CALLABLE">
    declare
        v_bool BOOLEAN := TRUE;
    begin
        v_bool := PACKNAME.STF$IS_PUBLIC_OBJECT(#{id});
        #{result,jdbcType=VARCHAR,mode=OUT} := CASE WHEN v_bool THEN 'TRUE' ELSE 'FALSE' END;
    end;
</update>

映射器:

public interface PLSQLMapper {
    public void isPublicObject(Map<String, Object> parameterMap);
}

主要:

PLSQLMapper mapper = session.getMapper(PLSQLMapper.class);

Map<String, Object> parameterMap = new HashMap<String, Object>();
parameterMap.put("id", 1);
mapper.isPublicObject(parameterMap);
System.out.println("result: " + parameterMap.get("result"));

【讨论】:

  • 这对我有用,与我的代码的主要区别是花括号。如果我把它们放在它上面不起作用,所以我把它弄得一团糟,尝试了很多东西,但大括号的主要点。谢谢!
  • @HernanDiaz,我使用的是 3.2.3-SNAPSHOT(但我用 3.1 进行了检查——它也可以),我更喜欢 parameterType(和地图或我自己的对象),因为 @987654328 @ 是 depracated。很高兴为您提供帮助。
  • PS:你能告诉我为什么你知道你不应该使用大括号{}?我看过一些代码示例,他们总是使用它们
  • 据我所知,括号是SQL92转义语法,Oracle语法是不带大括号的begin-end block。我没有看到带有 begin-end 和大括号的示例。我可能是错的,但我是 Oracle 新手。
  • 太棒了!你救了我的命 =)
【解决方案2】:

#{} 语法只能用于参数替换。它不是在执行 PL/SQL 后设置的变量。它只能在构建准备好的语句之前设置。

前进的一种方法是使用存储过程并使用 OUT 参数来获取结果。

【讨论】:

  • 我现在这样做是为了测试,但我不想只在生产中更改数据库,因为有几个项目依赖它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多