[设置参数时发生错误

问题描述 投票:0回答:1

我正在尝试使用MyBatis调用过程。

这是过程签名:

PROCEDURE pr_start(io_calc    IN OUT TYPE_CALC,
                   in_restart BOOLEAN DEFAULT TRUE,
                   in_user    VARCHAR2 DEFAULT NULL);

位于名为PACKAGE_PP的程序包中。

这是TYPE_CALC的声明方式:

CREATE OR REPLACE TYPE TYPE_CALC AS OBJECT (
    modelField   VARCHAR2(5 CHAR),
    sysField     VARCHAR2(5 CHAR),
    hexField     VARCHAR2(5 CHAR)
);

这是我的XML映射:

<select id="pr_start" 
    statementType="CALLABLE" parameterType="map">
    {
        exec PACKAGE_PP.pr_start(
            #{io_calc,mode=INOUT,jdbcType=STRUCT,jdbcTypeName=TYPE_CALC},
            #{in_restart,mode=IN,jdbcType=BOOLEAN,jdbcTypeName=BOOLEAN},
            #{in_user,mode=IN,jdbcType=VARCHAR,jdbcTypeName=VARCHAR2}
        )
    }
</select>

p.s。我也尝试使用call而不是exec,它会产生相同的错误)

我的Java映射器:

public interface PackagePPMapper {
    Object pr_start(Map<String, Object> param);
}

这就是我所说的:

Object[] typeCalcArr = new Object[]{"A", "s", "0xD"};

WebSphereNativeJdbcExtractor wsn = new WebSphereNativeJdbcExtractor();
Connection connection = wsn.getNativeConnection(session.getConnection()); //session is a SqlSession (properly initialized)
StructDescriptor descriptor = StructDescriptor.createDescriptor("TYPE_CALC", connection);
STRUCT typeCalc = new STRUCT(descriptor, connection, typeCalcArr);

Map<String, Object> parametersMap = new HashMap<String, Object>();
parametersMap.put("io_calc", typeCalc);
parametersMap.put("in_restart", restart);
parametersMap.put("in_user", user);

getMapper(session).pr_start(parametersMap);

StackTrace:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLException: Non supported SQL92 token at position: 6
### The error may exist in com/jsfproj/mybatis/xmlmapper/PackagePPMapper.xml
### The error may involve com.jsfproj.mybatis.PackagePPMapper.pr_start-Inline
### The error occurred while setting parameters
### SQL: {    exec PACKAGE_PP.pr_start(     ?,     ?,     ?    )   }
### Cause: java.sql.SQLException: Non supported SQL92 token at position: 6

我想念的是什么?应该以其他方式调用过程吗?

sql oracle plsql mybatis callable
1个回答
0
投票

将周围的括号删除到stop JDBC driver from trying to interpret query as SQL92-compatible query

<select id="pr_start" statementType="CALLABLE" parameterType="map">
  call PACKAGE_PP.pr_start(
            #{io_calc,mode=INOUT,jdbcType=STRUCT,jdbcTypeName=TYPE_CALC},
            #{in_restart,mode=IN,jdbcType=BOOLEAN,jdbcTypeName=BOOLEAN},
            #{in_user,mode=IN,jdbcType=VARCHAR,jdbcTypeName=VARCHAR2}
        )
</select>

也可以使用本机Oracle语法:

<select id="pr_start" statementType="CALLABLE" parameterType="map">
  begin
    PACKAGE_PP.pr_start(
      #{io_calc,mode=INOUT,jdbcType=STRUCT,jdbcTypeName=TYPE_CALC},
      #{in_restart,mode=IN,jdbcType=BOOLEAN,jdbcTypeName=BOOLEAN},
      #{in_user,mode=IN,jdbcType=VARCHAR,jdbcTypeName=VARCHAR2}
    );
  end;
</select>
© www.soinside.com 2019 - 2024. All rights reserved.