【问题标题】:MyBatis Oracle Call PLS-00306: wrong number or types of arguments in call ErrorMyBatis Oracle Call PLS-00306: Error number or types of arguments in call Error
【发布时间】: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


    【解决方案1】:

    问题应该是因为存储过程BOOLEAN out参数:

    • po_ok OUT BOOLEAN。

    ORACLE Jdbc 中的 PL/SQL BOOLEANS 存在一个已知问题。

    http://docs.oracle.com/cd/A87861_01/NT817EE/java.817/a83723/typesup1.htm


    包装 PL/SQL BOOLEAN、RECORD 和 TABLE 类型

    Oracle JDBC 驱动程序不支持调用 PL/SQL 类型 TABLE(现在称为索引表)、RECORD 或 BOOLEAN 的参数或返回值。

    作为一种解决方法,您可以创建将数据处理为 JDBC 支持的类型的包装程序。例如,要包装使用 PL/SQL 布尔值的存储过程,您可以创建一个 从 JDBC 获取字符或数字并将其作为 BOOLEAN 传递给原始过程的存储过程,或者对于输出参数,接受来自 原始过程并将其作为 CHAR 或 NUMBER 传递给 JDBC。同样,要包装使用 PL/SQL 记录的存储过程,您可以创建处理记录的存储过程 在其各个组件中(例如 CHAR 和 NUMBER)。要包装使用 PL/SQL 表的存储过程,您可以将数据分解为组件或使用 Oracle 集合 类型。

    我必须实现一个 PL/SQL 包装程序来检查 de BOOLEAN 值,并使用 jdbc 连接器将 VARCHAR 返回给 Java。

    PROCEDURE re_pr_ins_apunte_ref_w ( p_seqrec     IN   RE_T_GE_RECEPTIVO.seq_rec%TYPE, -- Oficina que gestiona el apunte
                                      p_seqres     IN   NUMBER,  -- Reserva
                                     p_importe    IN   NUMBER, -- Importe Haber.
                                     p_divisa     IN   gn_t_divisa.cod_divisa%TYPE, 
                                     p_codref     IN   RE_T_AD_LIBRO_AGENCIA.cod_referencia_pago%TYPE, -- Referencia de pago.
                                     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 VARCHAR2,                -- Indica si la funcion ha terminado correctamente
                                     po_error     OUT VARCHAR2,
                                     p_autonomous IN  BOOLEAN := TRUE,            -- True: Nextval, False: Nextval_no_autonomous
                                     p_merchant_id IN RE_T_AD_LIBRO_AGENCIA.merchant_id%TYPE DEFAULT NULL
    
                                  ) IS
    
        vo_ok  BOOLEAN; 
    
    BEGIN
    
    re_pr_ins_apunte_ref(   p_seqrec, -- Oficina que gestiona el apunte
                            p_seqres, -- Secuencia de la venta (seq_reserva, seq_cargo, seq_expediente, seq_contr)
                            p_importe, -- Importe Haber.
                            p_DIVISA, -- Divisa en la que está expresado el importe
                            p_codref, -- Referencia de pago.
                            p_codest,
                            p_codpas,
                            vo_ok,  -- Indica si la funcion ha terminado correctamente
                            po_error,  -- Descripcion del error
                            p_autonomous, -- True: Nextval, False: Nextval_no_autonomous
                            p_merchant_id);
    
    IF (VO_OK) THEN 
        po_ok := 'S';
      ELSE
        po_ok := 'N';
      END IF;
    
    END re_pr_ins_apunte_ref_w;
    

    【讨论】:

      猜你喜欢
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2016-09-12
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多