Вы действительно можете использовать объекты из драйвера JDBC Oracle, как предложено Филиппом. Большинство пользователей заканчивают создавать служебные методы, чтобы обернуть эту логику. Или они используют классы Spring mapper. Тем не менее, есть много ручной работы.
Другой подход заключается в использовании следующей версии 1.5.4 jOOQ - библиотеки с открытым исходным кодом, которую я разрабатываю, - где массивы поддерживаются единообразно. Поэтому, когда у вас есть ваши типы:
type MyDoubles as varray(50000) of double precision
type MyStrings as varray(50000) of varchar2(2000)
Тогда jOOQ будет генерировать классы, такие как
public class MyDoubles extends ArrayRecordImpl<Double> { /* ... */ }
public class MyStrings extends ArrayRecordImpl<String> { /* ... */ }
Ваши хранимые процедуры могут выглядеть следующим образом:
PROCEDURE MY_PROC1 (d IN MyDoubles, s IN MyStrings);
PROCEDURE MY_PROC2 (d IN MyDoubles, s OUT MyStrings);
PROCEDURE MY_PROC3 (d OUT MyDoubles, s OUT MyStrings);
И jOOQ сгенерирует другой класс Java, такой как
public class Procedures {
// Invoke procedure MY_PROC on JDBC Connection c with VARRAY arguments
public static void myProc1(Connection c, MyDoubles d, MyStrings s);
// The OUT parameter is mapped to a method return value
public static MyStrings myProc2(Connection c, MyDoubles d);
// MyProc3 is a wrapper for both OUT parameters
public static MyProc3 myProc3(Connection c);
}
Для сгенерированных артефактов кода вызов хранимых процедур с использованием UDT, параметров VARRAY настолько прост, насколько это возможно. А с генерацией исходного кода вы можете изменять объекты (например, ваши типы или процедуры) в вашей схеме базы данных, и ваши классы Java будут немедленно отражать это изменение.
См. Руководство по http://www.jooq.org/manual/META/PROCEDURE/ для получения более подробной информации