sql >> Databáze >  >> RDS >> Oracle

Načtení typu tabulky Oracle z uložené procedury pomocí JDBC

Nemůžete přistupovat k objektům PLSQL (případy 2 a 5 =objekty na úrovni balíčku) z javy, viz "java - předávání pole v uložené proceduře oracle". Můžete však přistupovat k typům SQL (případ 1 a 4).

Chcete-li získat parametry OUT z PL/SQL do javy, můžete použít metodu popsanou v jednom z vláken Toma Kytea pomocí OracleCallableStatement. Váš kód bude mít další krok, protože načítáte tabulku Object namísto tabulky VARCHAR.

Zde je ukázka s použitím Table of SQL Object, nejprve nastavení:

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

Skutečná třída java (pomocí dbms_output.put_line pro přihlášení, protože to budu volat z SQL, použijte System.out.println pokud je voláno z 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

Říkejme tomu:

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. Jak udělit vzdálený přístup k jedné databázi MySQL

  2. Jak určit automaticky vygenerovaný primární klíč použitý jako cizí klíč pro jinou tabulku

  3. Instalace SQLite

  4. Musí se zrušení databáze provést ne v žádné transakci?