Poniżej znajduje się opis jak przekazywać string, tablicę stringów oraz tablicę par stringów z Javy do Oracle’a Należy utworzyć typy w bazie danych:
create or replace type VARCHAR2_PAIR as object( k varchar2(200), v varchar2(200));
create or replace type VARCHAR2_PAIRS_TABLE as table of VARCHAR2_PAIR;
create or replace type VARCHAR2_TABLE as table of VARCHAR2(200);
. Potem utworzyć procedurę składowaną
CREATE OR REPLACE PROCEDURE arrays_from_java(p_scalar varchar2
, p_array IN VARCHAR2_TABLE
, p_pairs_array in VARCHAR2_PAIRS_TABLE);
. A na końcu zawołać ją z Javy:
public static void callArrayProcedure() throws Exception{ System.out.println("Preparing data"); String[] list1=new String[2]; list1[0] = "first string"; list1[1] = "second string"; String[][] list2=new String[2][]; { String[] pair1 = new String[2]; pair1[0] = "key1"; pair1[1] = "value1"; list2[0] = pair1; } { String[] pair2 = new String[2]; pair2[0] = "key2"; pair2[1] = "value2"; list2[1] = pair2; } System.out.println("Preparing connection"); SingleConnectionDataSource scds = new SingleConnectionDataSource(); scds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); scds.setUrl("jdbc:oracle:thin:@host:1521:service_name"); scds.setUsername(...); scds.setPassword(...); Connection conn = scds.getConnection(); System.out.println("Preparing array of strings"); ArrayDescriptor descriptor1 = ArrayDescriptor.createDescriptor("VARCHAR2_TABLE", conn ); ARRAY arrayToPass1 = new ARRAY( descriptor1, conn, list1 ); System.out.println("Preparing array of string pairs"); ArrayDescriptor descriptor2 = ArrayDescriptor.createDescriptor("VARCHAR2_PAIRS_TABLE", conn ); ARRAY arrayToPass2 = new ARRAY( descriptor2, conn, list2 ); System.out.println("Calling procedure"); OraclePreparedStatement ps = (OraclePreparedStatement) conn.prepareStatement( "{ call arrays_from_java( ?, ?, ? ) }" ); ps.setString( 1, "string"); ps.setARRAY( 2, arrayToPass1 ); ps.setARRAY( 3, arrayToPass2 ); ps.execute(); ps.close(); } .
Należy też dodać do classpath orai18n.jar, gdyż w przeciwnym wypadku jeśli baza nie będzie miała formatu UTF8 może występować błąd, że stringi się nullują podczas przekazywania do procedury