Как я могу вызвать хранимую процедуру Oracle с JDBC / Spring, где некоторые типы параметров определяются пользователем? - PullRequest
4 голосов
/ 17 августа 2010

Я пытаюсь вызвать хранимую процедуру Oracle из моей Java-программы.Я использую JDBC и StoredProcedure от Spring.Несколько параметров являются пользовательскими типами, и мне нужно знать, как их передавать.

В частности, какой тип я должен указать в карте параметров (т. Е. Какой из java.sql.Types.*)?И какой тип Java я должен использовать?Типы проблем определяются следующим образом:

type MyDoubles as varray(50000) of double precision
type MyStrings as varray(50000) of varchar2(2000)

Ответы [ 3 ]

1 голос
/ 07 октября 2010

Первое попадание в Google, кажется, показывает, как связать параметры типа VARRAY: http://www.devx.com/tips/Tip/22034. В примерах в этом документе используется подготовленное утверждение, но для хранимой процедуры оно должно работать точно так же.

Вот выдержка, показывающая основную концепцию:

String arrayElements[] = { "Test3", "Test4" };
PreparedStatement ps =
    conn.prepareStatement ("insert into sample_varray_table values (?)");

ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRING_VARRAY", conn);
ARRAY newArray = new ARRAY(desc, conn, arrayElements);
((OraclePreparedStatement)ps).setARRAY (1, newArray);

ps.execute ();

Для пояснения приведем несколько полных доменных имен:

  • oracle.sql.ArrayDescriptor
  • oracle.sql.ARRAY
  • oracle.jdbc.OraclePreparedStatement
0 голосов
/ 24 февраля 2011

Вы действительно можете использовать объекты из драйвера 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/ для получения более подробной информации

0 голосов
/ 17 августа 2010

Почему пользователи передают 50 000 экземпляров значений типа double и строк - так что Oracle может выполнять вычисления?

Это кажется мне обратным.Если у пользователей уже есть весь этот день, возможно, Java сможет выполнить этот расчет.Если вы действительно хотите, чтобы Oracle сделал это, я бы сказал, что данные уже должны быть резидентными в базе данных и не передаваться внутрь.

Разве оба не будут java.sql.Type.ARRAY?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...