sql >> Database teknologi >  >> RDS >> Oracle

Hent Oracle-tabeltypen fra den lagrede procedure ved hjælp af JDBC

Du kan ikke få adgang til PLSQL-objekter (tilfælde 2 &5 =objekter på pakkeniveau) fra java, se "java - overføring af array i oracle-lagret procedure". Du kan dog få adgang til SQL-typer (tilfælde 1 og 4).

For at få OUT-parametre fra PL/SQL til java, kan du bruge metoden beskrevet i en af ​​Tom Kytes tråde ved hjælp af OracleCallableStatement. Din kode vil have et ekstra trin, da du henter en tabel med objekt i stedet for en tabel med VARCHAR.

Her er en demo, der bruger Table of SQL Object, først opsætningen:

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 faktiske java-klasse (ved hjælp af dbms_output.put_line for at logge, fordi jeg vil kalde det fra SQL, skal du bruge System.out.println hvis det kaldes fra 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

Lad os kalde 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. Generer en heltalssekvens i MySQL

  2. Azure Virtual Machines til SQL Server-brug

  3. Sådan indstiller du sorteringen af ​​en kolonne i SQL Server (T-SQL)

  4. Gendannelse af MySQL-database fra fysiske filer