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();
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