stored salida procedimientos procedimiento parametros llamar ejemplo ejecutar desde callablestatement almacenados almacenado java oracle jdbc plsql associative-array

salida - java-Llamar a un procedimiento almacenado PL/SQL con matrices



parametros de salida en procedimientos almacenados sql server (2)

Aquí hay una referencia de guía oficial para pasar matrices en caso de que necesite pasar arreglos y no tablas: guía de Oracle

Oracle JDBC no es compatible con el método JDBC 4.0 createArrayOf de la interfaz java.sql.Connection. Este método solo permite tipos de matrices anónimas, mientras que todos los tipos de matriz de Oracle tienen nombre. Use el método específico de Oracle oracle.jdbc.OracleConnection.createARRAY en su lugar.

Pasar una matriz a una declaración preparada

Pase una matriz a una declaración preparada de la siguiente manera.

Nota: puede usar matrices como variables de vinculación IN o OUT. Defina la matriz que desea pasar a la instrucción preparada como un objeto oracle.sql.ARRAY.

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements); sql_type_name es una cadena de Java que especifica el nombre de tipo de SQL definido por el usuario de la matriz y elementos es un objeto java.lang.Object que contiene una matriz de Java de los elementos.

Cree un objeto java.sql.PreparedStatement que contenga la instrucción SQL que se ejecutará.

Eche su declaración preparada a OraclePreparedStatement, y use setARRAY para pasar la matriz a la declaración preparada.

(OraclePreparedStatement)stmt.setARRAY(parameterIndex, array); parameterIndex es el índice de parámetro y array es el objeto oracle.sql.ARRAY que construyó previamente.

Ejecute la declaración preparada.

Nota: por el

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

Ellos quieren decir:

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

Tengo un procedimiento almacenado PL / SQL similar al siguiente que necesito llamar en 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;

Intenté lo siguiente en 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;

Cuando hago esto, obtengo una SQLException: Unsupported Feature" en el método createArrayOf() . También probé setObject() y dentro de createArrayOf : "varchar" , "AssocArrayVarchar20_t" , "varchar_t" . Nada parece cambiar ese resultado .

¿Alguien sabe lo que estoy haciendo mal? Parece que no puedo hacer que funcione.

ACTUALIZACIÓN: ¡éxito!

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


El método createArrayOf se introdujo en Java 1.6, pero a mi leal saber y entender, no maneja las matrices asociativas PL / SQL de Oracle. Si tiene el controlador Oracle JDBC, entonces tiene acceso a las clases oracle.sql .

Debería poder CallableStatement a OracleCallableStatement . Desde allí, puedes llamar al método setPlsqlIndexTable y deberías poder pasar una matriz Java.

Vincula un parámetro PL / SQL index-by table en el modo de parámetro IN.