Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pobierz typ tabeli Oracle z procedury składowanej za pomocą JDBC

Nie możesz uzyskać dostępu do obiektów PLSQL (przypadki 2 i 5 =obiekty na poziomie pakietu) z javy, zobacz "java - przekazywanie tablicy w procedurze składowanej Oracle". Możesz jednak uzyskać dostęp do typów SQL (przypadek 1 i 4).

Aby uzyskać parametry OUT z PL/SQL do javy, możesz użyć metody opisanej w jednym z wątków Toma Kyte'a przy użyciu OracleCallableStatement. Twój kod będzie miał dodatkowy krok, ponieważ pobierasz tabelę Object zamiast tabeli VARCHAR.

Oto demonstracja korzystania z tabeli obiektu SQL, najpierw konfiguracja:

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

Właściwa klasa java (przy użyciu dbms_output.put_line aby zalogować, ponieważ wywołam to z SQL, użyj System.out.println jeśli wywołane z javy):

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

Nazwijmy to:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustawienie NLS_LANG dla cienkiego sterownika JDBC?

  2. oracle 12c - wybierz ciąg po ostatnim wystąpieniu znaku

  3. podając poprawną nazwę użytkownika i hasło, pobierz ORA-01017:nieprawidłowa nazwa użytkownika/hasło; Logowanie odrzucone

  4. Jak zmienić port internetowy w EBS 12.2

  5. R12.2 Raport gotowości do instalowania poprawek online