sql >> Database >  >> RDS >> Oracle

Haal het Oracle-tabeltype op uit de opgeslagen procedure met behulp van JDBC

U hebt geen toegang tot PLSQL-objecten (gevallen 2 &5 =objecten op pakketniveau) vanuit java, zie "java - doorgeven van array in Oracle-opgeslagen procedure". U kunt echter wel toegang krijgen tot SQL-typen (geval 1 en 4).

Om OUT-parameters van PL/SQL naar java te krijgen, kunt u de methode gebruiken die wordt beschreven in een van Tom Kyte's threads met OracleCallableStatement. Uw code heeft een extra stap omdat u een tabel Object ophaalt in plaats van een tabel VARCHAR.

Hier is een demo met Table of SQL Object, eerst de 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

De daadwerkelijke Java-klasse (met behulp van dbms_output.put_line om te loggen omdat ik het vanuit SQL zal aanroepen, gebruik System.out.println indien gebeld vanuit 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

Laten we het noemen:

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


  1. Op tijd gebaseerde prioriteit in Active Record Query

  2. Wat is STATISTICS IO in SQL Server?

  3. Hoe "Vind ik leuk" in SQL te gebruiken?

  4. Oracle Leeftijdsberekening vanaf geboortedatum en vandaag