【发布时间】:2017-06-26 19:33:38
【问题描述】:
我正在尝试从 MyBatis 调用 PL/SQL 存储过程。
我会为 Select Callable 语句类型尝试几个选项和配置,但我无法解决这个错误。
我有这个配置/文件:
PL/SQL 方法:
PROCEDURE re_pr_ins_apunte_ref ( p_seqrec IN RE_T_GE_RECEPTIVO.seq_rec%TYPE,
p_seqres IN NUMBER,
p_importe IN NUMBER,
p_divisa IN gn_t_divisa.cod_divisa%TYPE,
p_codref IN RE_T_AD_LIBRO_AGENCIA.cod_referencia_pago%TYPE,
p_codest IN RE_T_CD_ESTADO_COBRO.cod_estado%TYPE,
p_codpas IN RE_T_CD_ESTADO_COBRO.cod_pasarela%TYPE,
po_ok OUT BOOLEAN,
po_error OUT VARCHAR2,
p_autonomous IN BOOLEAN := TRUE, p_merchant_id IN RE_T_AD_LIBRO_AGENCIA.merchant_id%TYPE DEFAULT NULL
) IS
XML MyBatis Repository 选择操作:
<select id="agencyBookPostingLineInsRefCall"
parameterType="com.hotelbeds.commonbookingservice.entity.confirmation.agencybookpostingline.AgencyBookPostingLineInsIOWrapper"
statementType="CALLABLE">
{call Re_Pk_Libro_Agencia.re_pr_ins_apunte_ref(
#{wrapper.incomingOfficeId, mode=IN, jdbcType=INTEGER} => P_SEQREC
, #{wrapper.bookingNumber, mode=IN, jdbcType=INTEGER} => P_SEQRES
, #{wrapper.amount, mode=IN, jdbcType=NUMERIC} => P_IMPORTE
, #{wrapper.currencyId, mode=IN, jdbcType=VARCHAR} => P_DIVISA
, #{wrapper.referenceCode, mode=IN, jdbcType=VARCHAR} => P_CODREF
, #{wrapper.paymentStatus, mode=IN, jdbcType=VARCHAR} => P_CODEST
, #{wrapper.paymentGatewayId, mode=IN, jdbcType=VARCHAR} => P_CODPAS
, #{wrapper.ok, mode=OUT, jdbcType=VARCHAR, typeHandler=com.hotelbeds.commonbookingservice.db.handler.BooleanTrueFalseTypeHandler}
=> PO_OK
, #{wrapper.error, mode=OUT, jdbcType=VARCHAR }
=> PO_ERROR
, #{wrapper.autonomous, mode=IN, jdbcType=VARCHAR, typeHandler=com.hotelbeds.commonbookingservice.db.handler.BooleanTrueFalseTypeHandler}
=> P_AUTONOMOUS
, #{wrapper.merchantId, mode=IN, jdbcType=VARCHAR} => P_MERCHANT_ID
)
}
</select>
接口类中的方法
[...]
void agencyBookPostingLineInsRefCall(@Param("wrapper") AgencyBookPostingLineInsIOWrapper wrapper);
[...]
参数的包装类:
/**
* Wrapper for the method AgencyBookPostingLineIns
*/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
public class AgencyBookPostingLineInsIOWrapper implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = -6621442227563572393L;
/** Input */
private Integer incomingOfficeId;
private Integer bookingNumber;
private BigDecimal amount;
private String currencyId;
private String referenceCode;
private String paymentStatus;
private String paymentGatewayId;
private Boolean autonomous;
private String merchantId;
/** Output */
private Boolean ok;
private String error;
布尔类型处理程序:
/**
* Example with values true,false to boolean Handler.
*/
@MappedTypes(Boolean.class)
public class BooleanTrueFalseTypeHandler extends AbstractBooleanTypeHandler {
/** The Constant FALSE_STRING. */
private static final String FALSE_STRING = "false";
/** The Constant TRUE_STRING. */
private static final String TRUE_STRING = "true";
/**
* The constructor
*/
public BooleanTrueFalseTypeHandler() {
super();
falseString = FALSE_STRING;
trueString = TRUE_STRING;
}
}
还有错误:
==> Preparing: {call Re_Pk_Libro_Agencia.re_pr_ins_apunte_ref( ? => P_SEQREC , ? => P_SEQRES , ? => P_IMPORTE , ? => P_DIVISA , ? => P_CODREF , ? => P_CODEST , ? => P_CODPAS , ? => PO_OK , ? => PO_ERROR , ? => P_AUTONOMOUS , ? => P_MERCHANT_ID ) }
==> Parameters: 1(Integer), 3527758(Integer), 200(BigDecimal), EUR(String), 051609100(String), T(String), BIB(String), true(String), MERCHAN(String)
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: java.sql.SQLException: ORA-06550: línea 1, columna 7:
PLS-00306: wrong number or types of arguments in call to 'RE_PK_LIBRO_AGENCIA.RE_PR_INS_APUNTE_REF(P_SEQREC, P_SEQRES, P_IMPORTE, P_DIVISA, P_CODREF, P_CODEST, P_CODPAS, PO_OK, PO_ERROR, P_AUTONOMOUS, P_MERCHANT_ID)'
ORA-06550: línea 1, columna 7:
PL/SQL: Statement ignored
### The error may exist in com/hotelbeds/commonbookingservice/db/repository/booking/BookingReconfirmationRepository.xml
### The error may involve com.hotelbeds.commonbookingservice.db.repository.booking.BookingReconfirmationRepository.agencyBookPostingLineInsRefCall-Inline
### The error occurred while setting parameters
### SQL: {call Re_Pk_Libro_Agencia.re_pr_ins_apunte_ref( ? => P_SEQREC , ? => P_SEQRES , ? => P_IMPORTE , ? => P_DIVISA , ? => P_CODREF , ? => P_CODEST , ? => P_CODPAS , ? => PO_OK , ? => PO_ERROR , ? => P_AUTONOMOUS , ? => P_MERCHANT_ID ) }
### Cause: java.sql.SQLException: ORA-06550: línea 1, columna 7:
PLS-00306: wrong number or types of arguments in call to 'RE_PK_LIBRO_AGENCIA.RE_PR_INS_APUNTE_REF(P_SEQREC, P_SEQRES, P_IMPORTE, P_DIVISA, P_CODREF, P_CODEST, P_CODPAS, PO_OK, PO_ERROR, P_AUTONOMOUS, P_MERCHANT_ID)'
ORA-06550: línea 1, columna 7:
PL/SQL: Statement ignored
; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-06550: línea 1, columna 7:
PLS-00306: wrong number or types of arguments in call to 'RE_PK_LIBRO_AGENCIA.RE_PR_INS_APUNTE_REF(P_SEQREC, P_SEQRES, P_IMPORTE, P_DIVISA, P_CODREF, P_CODEST, P_CODPAS, PO_OK, PO_ERROR, P_AUTONOMOUS, P_MERCHANT_ID)'
ORA-06550: línea 1, columna 7:
PL/SQL: Statement ignored
我认为问题与 2 个 OUT 参数有关。
【问题讨论】:
标签: java oracle spring-boot plsql mybatis