Oracle
 sql >> Base de données >  >> RDS >> Oracle

Récupérer le type de table Oracle à partir d'une procédure stockée à l'aide de JDBC

Vous ne pouvez pas accéder aux objets PLSQL (cas 2 et 5 =objets au niveau du package) à partir de Java, voir "java - passer un tableau dans une procédure stockée oracle". Vous pouvez cependant accéder aux types SQL (cas 1 et 4).

Pour obtenir les paramètres OUT de PL/SQL vers Java, vous pouvez utiliser la méthode décrite dans l'un des threads de Tom Kyte en utilisant OracleCallableStatement. Votre code aura une étape supplémentaire puisque vous récupérez une table d'objet au lieu d'une table de VARCHAR.

Voici une démo utilisant Table of SQL Object, d'abord la configuration :

SQL> CREATE TYPE t_type AS OBJECT (val VARCHAR(4));
  2  /
Type created

SQL> CREATE TYPE t_table AS TABLE OF t_type;
  2  /
Type created

SQL> CREATE OR REPLACE PROCEDURE p_sql_type (p_out OUT t_table) IS
  2  BEGIN
  3     p_out := t_table(t_type('a'), t_type('b'));
  4  END;
  5  /
Procedure created

La classe Java réelle (en utilisant dbms_output.put_line pour me connecter car je vais l'appeler depuis SQL, utilisez System.out.println si appelé depuis java):

SQL> CREATE OR REPLACE
  2  AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
  3  as
  4  import java.sql.*;
  5  import oracle.sql.*;
  6  import oracle.jdbc.driver.*;
  7  
  8  public class ArrayDemo {
  9     
 10     private static void log(String s) throws SQLException {
 11        PreparedStatement ps =
 12           new OracleDriver().defaultConnection().prepareStatement
 13           ( "begin dbms_output.put_line(:x); end;" );
 14        ps.setString(1, s);
 15        ps.execute();
 16        ps.close();
 17     }
 18  
 19     public static void getArray() throws SQLException {
 20  
 21        Connection conn = new OracleDriver().defaultConnection();
 22  
 23        OracleCallableStatement cs =
 24           (OracleCallableStatement)conn.prepareCall
 25           ( "begin p_sql_type(?); end;" );
 26        cs.registerOutParameter(1, OracleTypes.ARRAY, "T_TABLE");
 27        cs.execute();
 28        ARRAY array_to_pass = cs.getARRAY(1);
 29  
 30        /*showing content*/
 31        Datum[] elements = array_to_pass.getOracleArray();
 32  
 33        for (int i=0;i<elements.length;i++){
 34           Object[] element = ((STRUCT) elements[i]).getAttributes();
 35           String value = (String)element[0];
 36           log("array(" + i + ").val=" + value);
 37        }
 38     }
 39  }
 40  /
Java created

Appelons-le :

SQL> CREATE OR REPLACE
  2  PROCEDURE show_java_calling_plsql
  3  AS LANGUAGE JAVA
  4  NAME 'ArrayDemo.getArray()';
  5  /

Procedure created

SQL> EXEC show_java_calling_plsql;

array(0).val=a
array(1).val=b