sql >> Databasteknik >  >> RDS >> Oracle

Hur får jag en utdataparameter för lagrad procedur som är en array att fungera?

Använd inte en associativ array - använd en samling:

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

Sedan kan du göra:

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

Om du måste använda en PL/SQL associativ array som en indata till din procedur, skriv då en funktion som tar en samling och matar ut en associativ array av lämplig typ och anrop det:

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

Obs:Det här svaret förutsätter att du använder Oracle-drivrutinen i ojdbc6.jar som inte verkar ha OracleConnection.createOracleArray() metod men den kommer förhoppningsvis att vara portabel genom att ändra oracle.sql.ARRAY till java.sql.Array och med de nyare metoderna.




  1. Hanterad ODP.NET-drivrutin visas inte i dialogrutan Datakälla

  2. Skapa Oracle Sequence Trigger

  3. Hur man hämtar fältnamn från temporär tabell (SQL Server 2008)

  4. Skapa ett index på en enorm MySQL-produktionstabell utan tabelllåsning