设置参数时出错

Posted

技术标签:

【中文标题】设置参数时出错【英文标题】:Error occurred while setting parameters 【发布时间】:2014-08-17 01:30:12 【问题描述】:

我正在尝试使用 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);

堆栈跟踪:

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

我错过了什么?过程是否应该以其他方式调用?

【问题讨论】:

只是一个疯狂的猜测:你能尝试在你的包过程中使用像 NUMBER 这样的 SQL 数据类型而不是 BOOLEAN 吗? @FrankSchmitt 我也有这个猜测,我尝试将BOOLEAN 更改为NUMBER,然后我将映射更改为接受NUMBER(带有#in_restart,mode=IN,jdbcType=NUMERIC,jdbcTypeName=NUMBER),并传递@ 987654336@而不是true,但不幸的是没有任何改变,我得到了完全相同的错误 我不知道 mybatis,但EXEC ... 通常不是用于调用存储过程的有效 Oracle 语法(除非您使用的是 SQL/Plus)。尝试将其包装在匿名 PL/SQL 块中,而不是 begin PACKAGE_PP.pr_start(...); end;,有关示例,请参阅 ***.com/questions/16859123/…。 @FrankSchmitt 试过了,同样的错误。无论如何,是的,我使用的是 SQL Plus,所以 exec 是有效的 【参考方案1】:

去掉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>

【讨论】:

以上是关于设置参数时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 char 数组发送到 DLL 调用“不知道如何转换参数”时出错

对 s-s-rS 中的参数使用 DateAdd 时出错

Flutter FFMPEG:设置配置文件基线时出错

调用元类基础函数()参数时出错 1 必须是代码而不是 str

使用三元语法将参数设置为 DBNull.Value 会出错?

异常“已传递主参数'webdriver'但未定义主参数创建注释时出错