我有一个函数在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;
答案 0 :(得分:6)
我写了parameterType
&amp; Map
示例。它适用于我的测试数据。
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"));
答案 1 :(得分:-1)
#{}语法只能用于参数替换。它不是在执行PL / SQL后设置的变量。它只能在构建预准备语句之前设置。
前进的一种方法是使用存储过程并使用OUT参数来获得结果。