Wie Oracle gespeicherte Prozedur aufrufen, die benutzerdefinierten Typ in Java enthalten?



java stored procedure query (3)

Das ist ein ziemlich gutes Beispiel. Wenn Sie java.sql.SQLException sehen: ungültiger Name pattern: still. Überprüfen Sie den Gültigkeitsbereich des Typs, den Sie in Oracle deklariert haben. Ich verwende Oracle 11g und musste sowohl das Objekt des String-Arrays als auch die Tabelle der Objekte meines Typs in der Schema-Ebene deklarieren. Verbrachte ungefähr 3 Stunden und fand das.

oracle.sql.StructDescriptor docObjDescriptor = StructDescriptor.createDescriptor("SSIADM.DOCUMENT_OBJECT",conn);
  String[] strArray = new String[] {"doc1","file1"};             
  oracle.sql.STRUCT DocObject1 = new STRUCT(docObjDescriptor,conn,strArray);

   strArray = new String[] {"doc2","file2"};
   oracle.sql.STRUCT DocObject2 = new STRUCT(docObjDescriptor,conn,strArray);

    oracle.sql.STRUCT[] docObjArray = {DocObject1,DocObject2};

    arrDesc = ArrayDescriptor.createDescriptor("DOCUMENT_TABLE", conn);
    oracle.sql.ARRAY array = new ARRAY(arrDesc, conn, docObjArray);

https://ffff65535.com

In Oracle DB:

Ich habe folgende gespeicherte Prozedur:

procedure getInfo ( p_ids IN IDS_TABLE, p_details OUT cursor )

Typ IDS_TABLE ist:

create or replace type IDS_TABLE as table of IDS    

create or replace type IDS as object ( id1 NUMBER, id2 NUMBER, id3 NUMBER )

Wie kann ich getInfo in Java aufrufen?


Das manuelle Einrichten einer Verbindung zwischen Oracle SQL-Objekten und Java-Objekten ist keine triviale Aufgabe. Insbesondere Arrays (oder verschachtelte Tabellen) von benutzerdefinierten Objekten sind komplexer von Java zu Oracle als Arrays von Standard-Datentypen. Mit anderen Worten, es ist einfacher, eine Prozedur mit Signatur aufzurufen:

(TABLE OF NUMBER, TABLE OF NUMBER, TABLE OF NUMBER)`

als ein Verfahren, dessen Unterschrift ist:

(TABLE OF (NUMBER, NUMBER, NUMBER))   <- your case

Sie können einen Wrapper für Ihre Prozedur schreiben, um den zweiten Fall in den ersten Fall zu transformieren.

Davon abgesehen ist es bei weitem nicht unmöglich, Ihr Verfahren abzubilden. Das folgende Beispiel ist weitgehend von einem Beitrag von Tom Kyte inspiriert . Tom beschreibt, wie man eine TABLE OF NUMBER mit oracle.sql.ARRAY . In Ihrem Fall müssen wir auch oracle.sql.STRUCT , um das IDS SQL-Objekt oracle.sql.STRUCT .

Sie können auch das Oracle-JDBC-Dokument, insbesondere das Kapitel Arbeiten mit Oracle-Objekttypen , durchsuchen.

Zuerst ist eine ähnliche Konfiguration wie bei Ihnen:

SQL> CREATE OR REPLACE TYPE IDS AS OBJECT ( id1 NUMBER, id2 NUMBER, id3 NUMBER );
  2  /
Type created

SQL> CREATE OR REPLACE TYPE IDS_TABLE AS TABLE OF IDS;
  2  /
Type created

SQL> CREATE OR REPLACE PROCEDURE getInfo(p_ids IN IDS_TABLE) IS
  2  BEGIN
  3     FOR i IN 1 .. p_ids.COUNT LOOP
  4        dbms_output.put_line(p_ids(i).id1
  5                             || ',' || p_ids(i).id2
  6                             || ',' || p_ids(i).id3);
  7     END LOOP;
  8  END getInfo;
  9  /     
Procedure created

Dies ist die Java-Prozedur:

SQL> CREATE OR REPLACE
  2  AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
  3  as
  4  import java.io.*;
  5  import java.sql.*;
  6  import oracle.sql.*;
  7  import oracle.jdbc.driver.*;
  8  
  9  public class ArrayDemo {
 10  
 11     public static void passArray() throws SQLException {
 12  
 13        Connection conn =
 14           new OracleDriver().defaultConnection();
 15  
 16  
 17        StructDescriptor itemDescriptor =
 18           StructDescriptor.createDescriptor("IDS",conn);
 19  
 20        Object[] itemAtributes = new Object[] {new Integer(1),
 21                                               new Integer(2),
 22                                               new Integer(3)};
 23        STRUCT itemObject1 = new STRUCT(itemDescriptor,conn,itemAtributes);
 24  
 25        itemAtributes = new Object[] {new Integer(4),
 26                                      new Integer(5),
 27                                      new Integer(6)};
 28        STRUCT itemObject2 = new STRUCT(itemDescriptor,conn,itemAtributes);
 29  
 30        STRUCT[] idsArray = {itemObject1,itemObject2};
 31  
 32        ArrayDescriptor descriptor =
 33           ArrayDescriptor.createDescriptor( "IDS_TABLE", conn );
 34  
 35        ARRAY array_to_pass =
 36           new ARRAY( descriptor, conn, idsArray );
 37  
 38        OraclePreparedStatement ps =
 39           (OraclePreparedStatement)conn.prepareStatement
 40           ( "begin getInfo(:x); end;" );
 41  
 42        ps.setARRAY( 1, array_to_pass );
 43        ps.execute();
 44  
 45     }
 46  }
 47  /
Java created

Nennen wir es:

SQL> CREATE OR REPLACE
  2  PROCEDURE show_java_calling_plsql
  3  AS LANGUAGE JAVA
  4  NAME 'ArrayDemo.passArray()';
  5  /
Procedure created

SQL> exec show_java_calling_plsql ;
1,2,3
4,5,6

PL/SQL procedure successfully completed





jdbc