sql >> Database teknologi >  >> RDS >> Oracle

Hvordan får jeg en lagret procedure-outputparameter, der er et array, til at fungere?

Brug ikke et associativt array - brug en samling:

CREATE TYPE StringArray IS TABLE OF VARCHAR2(4000);
CREATE TYPE CLOBArray   IS TABLE OF CLOB;

Så kan du gøre:

public void testString(Connection connection) {
  String[] values = { "alpha", "beta", "gamma" };
  try {
    OracleConnection oc = (OracleConnection) connection;

    ARRAY stringArray = oc.createARRAY( "STRINGARRAY", values ); // Upper case identifier

    OracleCallableStatement st = (OracleCallableStatement) oc.prepareCall(
      "begin test.upper( :in_array, :out_array ); end;"
    );

    st.setARRAYAtName( "in_array", stringArray );
    st.registerOutParameter( "out_array", Types.ARRAY, "STRINGARRAY"); // Upper case again
    st.execute();

    String[] result = (String[])st.getARRAY( 2 ).getArray();

    System.out.println("Length: " + result.length);
    System.out.println("First: " + result[0]);
  } (catch SQLException e) {
    // Handle error
  }
}

Hvis du skal bruge et PL/SQL associativt array som input til din procedure, så skriv en funktion, der tager en samling og udsender en associativ array af den passende type, og kald det:

BEGIN TEST.UPPER( TO_ASSOC_ARRAY( :in_collection ), :out_array ); END;

Bemærk:Dette svar antager, at du bruger Oracle-driveren i ojdbc6.jar, som ikke ser ud til at have OracleConnection.createOracleArray() metode, men den vil forhåbentlig være bærbar ved at ændre oracle.sql.ARRAY til java.sql.Array og ved at bruge de nyere metoder.




  1. T-SQL for at finde Remote Server Name på den linkede server

  2. SQL Server 2016:OLTP-forbedringer i hukommelsen

  3. Gruppér efter klausul i mySQL og postgreSQL, hvorfor fejlen i postgreSQL?

  4. Opret forbindelse til mysql i en docker-container fra værten