代码之家  ›  专栏  ›  技术社区  ›  Verv jenisys

使用数组作为参数调用存储过程

  •  0
  • Verv jenisys  · 技术社区  · 8 年前

    使用Java和Spring数据,我需要从Oracle数据库调用以下存储过程:

    TYPE R_ID_INSC_TYPE IS RECORD(id_insc  INSC_REGISTRE.ID%TYPE);
    TYPE T_ID_INSC IS TABLE OF R_ID_INSC_TYPE INDEX BY BINARY_INTEGER;
    
    PROCEDURE CHARGER_RECHERCHE
    (
        P_NO_DEMANDE    IN NUMBER,
        P_SEQ_DEM       IN NUMBER,
        P_ETAPE_RECH    IN VARCHAR2,
        P_ID_INSC_TAB   IN T_ID_INSC
    );
    

    public void call(final Integer numeroDemande,
                     final Integer numeroSequenceDemande,
                     final EtapeRecherche etapeRecherche,
                     final Integer[] ids) {
    
        new SimpleJdbcCall(this.jdbcTemplate)
                .withSchemaName(this.schemaName)
                .withProcedureName(this.procedureName)
                .declareParameters(
                        new SqlParameter("P_NO_DEMANDE", Types.INTEGER),
                        new SqlParameter("P_SEQ_DEM", Types.INTEGER),
                        new SqlParameter("P_ETAPE_RECH", Types.VARCHAR),
                        new SqlParameter("P_ID_INSC_TAB", Types.ARRAY))
                .execute(numeroDemande, numeroSequenceDemande, etapeRecherche.getValue(), ids);
    }
    

    会引发以下错误:

    org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call PLATEFORME.CHARGER_RECHERCHE()}];
    nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'CHARGER_RECHERCHE'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    

    declare
    
    P_ID_INSC_TAB  PLATEFORME.T_ID_INSC;
    P_NO_DEMANDE   NUMBER:=317225;
    P_SEQ_DEM NUMBER:=1;
    P_ETAPE_RECH VARCHAR2(2):='AI';
    
    begin
    
    
    P_ID_INSC_TAB(1).id_insc:=1258773;
    P_ID_INSC_TAB(2).id_insc:=1258774;
    P_ID_INSC_TAB(3).id_insc:=1258775;
    
    PLATEFORME.CHARGER_RECHERCHE(P_NO_DEMANDE,P_SEQ_DEM,P_ETAPE_RECH,P_ID_INSC_TAB);
    
    end;
    

    TYPE T_ID_INSC IS TABLE OF NUMBER(9) INDEX BY BINARY_INTEGER;
    
    PROCEDURE CHARGER_RECHERCHE
    (
        P_NO_DEMANDE    IN NUMBER,
        P_SEQ_DEM       IN NUMBER,
        P_ETAPE_RECH    IN VARCHAR2,
        P_ID_INSC_TAB   IN T_ID_INSC
    );
    

    要成功调用此存储过程,我需要做什么?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Saxon    8 年前

    T_ID_INSC是Oracle类型。 ID不能是java整数数组。

    import java.sql.*;
    import oracle.jdbc.*;
    import oracle.sql.*;
    
    ArrayDescriptor arrDesc = ArrayDescriptor.createDescriptor("T_ID_INSC", conn);
    Integer[] data = {1258773, 1258774, 1258775};
    Array ids = new ARRAY(arrDesc, conn, data);
    

    或者尝试:

    import java.sql.*;
    import oracle.jdbc.*;
    import oracle.sql.*;
    
    Integer[] data = {1258773, 1258774, 1258775};
    Array ids = ((OracleConnection)conn).createOracleArray("T_ID_INSC", data);
    
        2
  •  0
  •   Akash    8 年前

    您可以将id设为循环并调用存储过程。

    for (int i=0;i<arr.size();i++) 
    {
    int id=arr[i];
    //call stored procedure here, passing id
    }
    
    推荐文章