java-вызов хранимой процедуры PL / SQL с массивами



У меня есть хранимая процедура PL/SQL, подобная следующей, которую мне нужно вызвать в Java:



TYPE AssocArrayVarchar20_t   is table of VARCHAR2(20)   index by BINARY_INTEGER
TYPE AssocArrayVarchar4100_t is table of VARCHAR2(4100) index by BINARY_INTEGER
TYPE AssocArrayNumber_t is table of NUMBER index by BINARY_INTEGER

PROCEDURE DATA_WRITE( I_NAME IN AssocArrayVarchar20_t,
I_NUM IN AssocArrayNumber_t,
I_NOTE IN AssocArrayVarchar4100_t)
// Do Stuff
END DATA_WRITE;


Я попробовал следующее на Java:



CallableStatement stmt = conn.prepareCall("begin DATA_WRITE(?, ?, ?); end;");
stmt.setArray(0, conn.createArrayOf("VARCHAR", new String[]{ name }));
stmt.setArray(1, conn.createArrayOf("NUMBER", new Integer[]{ num }));
stmt.setArray(2, conn.createArrayOf("VARCHAR2", new String[]{ notes }));
stmet.execute;


Когда я делаю это, я получаю SQLException: Unsupported Feature" на методе createArrayOf(). Я также пробовал setObject() и внутри createArrayOf: "varchar", "AssocArrayVarchar20_t", "varchar_t". Кажется, ничто не может изменить этот исход.



Кто-нибудь знает, что я делаю не так? Я никак не могу заставить его работать.

Обновление: успех!



OracleCallableStatement pStmt = (OracleCallableStatement) conn.prepareCall("begin DATA_WRITE(?, ?, ?); end;");
pStmt.setPlsqlIndexTable(1, new String[]{ name }, 1, 1, OracleTypes.VARCHAR, 20);
pStmt.setPlsqlIndexTable(2, new Integer[]{ num }, 1, 1, OracleTypes.NUMBER, 0);
pStmt.setPlsqlIndexTable(3, new String[]{ notes }, 1, 1, OracleTypes.VARCHAR, 4100);
pStmt.execute();
724   2  

2 ответов:

createArrayOf метод был введен в Java 1.6, но, насколько мне известно, он не обрабатывает ассоциативные массивы Oracle PL/SQL. Если у вас есть драйвер Oracle JDBC, то у вас есть доступ к классам oracle.sql.

Вы должны быть в состоянии понизить CallableStatement до OracleCallableStatement. Оттуда вы можете вызвать методsetPlsqlIndexTable , и вы должны быть в состоянии передать в массив Java.

Связывает параметр таблицы PL / SQL index-by в режиме IN parameter.

Вот официальное руководство по передаче массивов, если вам нужно передать массивы, а не таблицы: oracle guide

Oracle JDBC не поддерживает метод createArrayOf метода JDBC 4.0 на Яве.язык SQL.Интерфейс подключения. Этот метод позволяет только анонимно типы массивов, в то время как все типы массивов Oracle имеют имена. Использовать Oracle специфический метод оракула.интерфейс jdbc.Объекта oracleconnection.вместо этого создай беспорядок.

Передача массива подготовленному Утверждение

Передайте массив в подготовленный оператор следующим образом.

Примечание: массивы можно использовать как переменные привязки IN или OUT. Определять массив, который требуется передать подготовленному оператору в виде оракул.язык SQL.объект array.

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, элементы); sql_type_name-это строка Java, указывающая определяемый пользователем Имя типа SQL массива и элементов-java.яз..Объект содержащий массив элементов Java.

Создать Ява.язык SQL.PreparedStatement объект, содержащий SQL заявление для запуска.

Приведите подготовленное заявление к OraclePreparedStatement и используйте setARRAY для передачи массива в подготовленный оператор.

(OraclePreparedStatement)stmt.setARRAY(parameterIndex, array); parameterIndex-это индекс параметра, а массив-это оракул.язык SQL.Объект массива, созданный ранее.

Запустите подготовленный оператор.

Примечание: по

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements); 

Они означают:

java.sql.Connection connection = ...
oracle.jdbc.OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
ARRAY array = oracleConnection.createARRAY(sql_type_name, elements); 

Comments

    Ничего не найдено.