簡體   English   中英

MyBatis Oracle呼叫PLS-00306:呼叫錯誤的參數數量或類型錯誤

[英]MyBatis Oracle Call PLS-00306: wrong number or types of arguments in call Error

我正在嘗試從MyBatis調用PL / SQL存儲過程。

我會為“選擇可調用”語句類型嘗試幾種選項和配置,但是我對此錯誤有所保留。

我有以下配置/文件:

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存儲庫選擇操作:

<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參數有關。

該問題推測是由於存儲過程的BOOLEAN out參數:

  • po_ok瘋了。

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傳遞給原始過程,或者對於輸出參數,接受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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM