6

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: Error setting null for parameter #2 with JdbcType OTHER.このパラメーターに別の 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;
4

2 に答える 2

10

私が書いた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"));
于 2013-06-03T06:49:59.663 に答える
-1

#{} 構文は、パラメーター置換にのみ使用できます。PL/SQL の実行後に設定される変数ではありません。準備済みステートメントが作成される前にのみ設定できます。

前進する方法の 1 つは、ストアド プロシージャを使用し、OUT パラメータを使用して結果を取得することです。

于 2013-05-31T15:48:55.237 に答える