sql >> Database >  >> RDS >> Oracle

Hoe krijg ik een opgeslagen procedure-uitvoerparameter die een array is om te werken?

Gebruik geen associatieve array - gebruik een verzameling:

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

Dan kun je het volgende doen:

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
  }
}

Als u een PL/SQL-associatieve array als invoer voor uw procedure moet gebruiken, schrijf dan een functie die een verzameling nodig heeft en een associatieve array van het juiste type uitvoert en roep die dan aan:

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

Opmerking:dit antwoord gaat uit van het gebruik van de Oracle-driver in ojdbc6.jar die niet de OracleConnection.createOracleArray() lijkt te hebben methode, maar het zal, hopelijk, draagbaar zijn om oracle.sql.ARRAY te veranderen naar java.sql.Array en met behulp van de nieuwere methoden.




  1. Wat is de fout Elke afgeleide tabel moet zijn eigen alias hebben in MySQL?

  2. Geautomatiseerd testen van het upgradeproces voor PXC/MariaDB Galera Cluster

  3. SQL-, unieke en primaire sleutels

  4. Schemapatroon zoeken naar gegevensklasse-associatie