Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Rufen Sie den Oracle-Tabellentyp mithilfe von JDBC aus der gespeicherten Prozedur ab

Sie können nicht auf PLSQL-Objekte (Fälle 2 und 5 =Objekte auf Paketebene) von Java aus zugreifen, siehe "Java - Array in gespeicherter Oracle-Prozedur übergeben". Sie können jedoch auf SQL-Typen zugreifen (Fall 1 und 4).

Um OUT-Parameter von PL/SQL nach Java zu bekommen, können Sie die in einem Thread von Tom Kyte beschriebene Methode mit OracleCallableStatement verwenden. Ihr Code wird einen zusätzlichen Schritt haben, da Sie eine Objekttabelle anstelle einer VARCHAR-Tabelle abrufen.

Hier ist eine Demo mit Table of SQL Object, zuerst das Setup:

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

Die eigentliche Java-Klasse (unter Verwendung von dbms_output.put_line Um sich anzumelden, da ich es von SQL aus aufrufen werde, verwenden Sie System.out.println wenn aus Java aufgerufen):

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

Nennen wir es:

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