设置参数时出错
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 调用“不知道如何转换参数”时出错
调用元类基础函数()参数时出错 1 必须是代码而不是 str