当前位置: 首页 > 面试题库 >

无法从mybatis执行的oracle过程接收参数

罗浩然
2023-03-14
问题内容

我使用Spring 3.0.5开发Java应用程序,并使用mybatis-spring处理数据库Oracle。

我有一个用于mybatis的界面:

public interface SubscriberMapper {
    Subscriber getSubscriberByMsisdn(String msisdn);

    void insertSubscriber(Subscriber subscriber);

    void updateSubscriber(Subscriber subscriber);

    void canCustomerSubscribe(@Param("msisdn") String msisdn, 
                         @Param("responseCode") Integer responseCode);

}

canCustomerSubscribe的mybatis xml内容:

<parameterMap id="canCustomerSubscribeParams" type="map">
    <parameter property="msisdn" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
    <parameter property="responseCode" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="OUT"/>
</parameterMap>
<select id="canCustomerSubscribe" parameterMap="canCustomerSubscribeParams" statementType="CALLABLE">
    CALL wallet.pkg_wallet_validation.can_customer_subscribe(#{msisdn}, #{responseCode})
</select>

和要执行的代码:

public void subscribe(String msisdn) throws InvalidArgumentException {
    Integer responseCode = 0;
    subscriberMapper.canCustomerSubscribe(msisdn, responseCode);
    System.out.println("msisdn: " + msisdn + ", responseCode: " + responseCode);
}

当我使用无效的“ msisdn”执行“订阅”方法时,我没有从过程中收到实际的输出值。在数据库中执行此过程将返回reponseValue =
1001,但是在Java代码中,我收到0。我为mybatis打开了针对stout的调试日志记录,输出为:

2011-10-19 10:32:46,732 DEBUG [main](Slf4jImpl.java:28)ooo连接已打开
2011-10-19 10:32:46,909 DEBUG [main](Slf4jImpl.java:28)==>执行中:CALL wallet.pkg_wallet_validation.can_customer_subscribe(?,?) 
2011-10-19 10:32:46,911 DEBUG [main](Slf4jImpl.java:28)==>参数:509999999(String),0(Integer)
msisdn:509999999,responseCode:0

当我更改“订阅”方法responseCode = null时,我收到并出错:

org.springframework.jdbc.UncategorizedSQLException:设置空参数时出错。大多数JDBC驱动程序要求必须为所有可为空的参数指定JdbcType。原因:java.sql.SQLException:无效的列类型
; 未分类的SQLException for SQL []; SQL状态[null]; 错误代码[17004];无效的列类型;嵌套异常为java.sql.SQLException:无效的列类型

问题答案:

我找到了解决方案。映射必须是用户,而不是canCustomerSubscribe方法中的两个参数。

 void canCustomerSubscribe(Map<String,Object> params);

mybatis xml内容:

<select id="canCustomerSubscribe" parameterType="java.util.HashMap" statementType="CALLABLE">
    CALL wallet.pkg_wallet_validation.can_customer_subscribe(
    #{msisdn, jdbcType=VARCHAR, javaType=java.lang.String, mode=IN},
    #{responseCode,jdbcType=NUMERIC, javaType=java.lang.Integer, mode=OUT})
</select>

(我需要在参数属性之间添加逗号)

从订阅服务方法调用它:

public void subscribe(String msisdn) throws InvalidArgumentException {
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("msisdn", msisdn);
    params.put("responseCode", null);
    subscriberMapper.canCustomerSubscribe(params);
    System.out.println(params.get("responseCode"));
}


 类似资料:
  • 问题内容: 我的包体内有一个proc: 我在包装规格中公开了这一点。 如何在PL SQL Developer(或类似版本)的新SQL窗口中执行此过程? 问题答案: 您可以相对轻松地执行该过程 当然,这只是将游标返回到调用应用程序。它不执行任何操作来从游标中获取数据,对该数据执行任何操作或关闭游标。假设您的目标是向其中写入一些数据(有时对于原型设计很有用,但生产代码不应该依赖该数据),则可以执行以下

  • 在尝试使用JPA在Oracle中执行存储过程时,出现以下异常: 原因:组织。开关站。HandlerException:java。lang.NoSuchMethodError:javax。坚持不懈实体管理器。createStoredProcedureQuery(Ljava/lang/String;) 有一个代码段:

  • 我一直试图使用Hibernate执行Oracle存储过程。这不是用于生产,而是用于我正在研究的Java源代码解析项目。简单地说,我不能从Oracle存储过程返回值。 我搜索并阅读了SO、Hibernate Community/Documentations(原生SQL章节)链接中的所有相关链接,并尝试了这些建议,但不知何故无法让它们发挥作用。以下是我的来源--我只包括相关的部分。

  • 我通过Hibernate调用了一个带有OUT参数的存储过程,得到了以下错误: 我的存储过程: Hibernate映射: 我按如下方式调用了存储过程: 有人能解释一下这段代码有什么问题吗?

  • 问题内容: 简而言之:我正在尝试在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity Framework,但是由于修改密钥的限制,EF无法处理此特定命令。值)。 过程具有一些参数(仅IN),并更新表中的值。我通过运行测试了它: 它工作正常。 我的参数定义如下: 我的查询是: 我正在尝试从C#代码执行它。即通过运行: 我收到错误OR

  • 我正在尝试构建一个简单的应用程序,可以从FCM(Firebase云消息传递系统)接收通知。我能够生成令牌并将其显示在文本视图中。另外,我还编写了在“FirebaseMessagingService”类“中使用log.d()在LOG上打印通知消息的逻辑,该类从”FirebaseMessagingService“扩展而来。但是,一旦我从FCM控制台发送消息,应用程序就会崩溃,并且在Android显示器