sql >> Databasteknik >  >> RDS >> Oracle

Hämta Oracle-tabelltyp från lagrad procedur med JDBC

Du kan inte komma åt PLSQL-objekt (fall 2 &5 =objekt på paketnivå) från java, se "java - överföring av array i oracle-lagrad procedur". Du kan dock komma åt SQL-typer (fall 1 och 4).

För att få OUT-parametrar från PL/SQL till java kan du använda metoden som beskrivs i en av Tom Kytes trådar med hjälp av OracleCallableStatement. Din kod kommer att ha ett extra steg eftersom du hämtar en tabell med objekt istället för en tabell med VARCHAR.

Här är en demo med Table of SQL Object, först installationen:

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

Den faktiska java-klassen (med dbms_output.put_line för att logga eftersom jag kommer att anropa det från SQL, använd System.out.println om anropad från 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

Låt oss kalla det:

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. Hur man importerar en databas med phpMyAdmin

  2. Felsökning av privata procedurer

  3. Hur man subtraherar ett år från ett datum i MariaDB

  4. Transponera utvalda resultat med Oracle