sql >> Databasteknik >  >> RDS >> Oracle

Hur anropar man oracles lagrad procedur som inkluderar användardefinierad typ i java?

Att sätta upp en länk mellan Oracle SQL-objekt och java-objekt manuellt är inte en trivial uppgift. I synnerhet är arrayer (eller kapslade tabeller) av användardefinierade objekt mer komplexa att överföra från Java till Oracle än arrayer med standarddatatyper. Det är med andra ord lättare att anropa ett förfarande med signatur:

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

än ett förfarande vars signatur är:

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

Du kan skriva ett omslag runt din procedur för att förvandla det andra fallet till det första fallet.

Med det sagt är det absolut inte omöjligt att kartlägga din procedur. Följande exempel är till stor del inspirerat av ett inlägg av Tom Kyte. Tom beskriver hur man mappar en TABLE OF NUMBER med oracle.sql.ARRAY . I ditt fall måste vi också använda oracle.sql.STRUCT för att mappa IDS SQL-objekt.

Du kanske också vill bläddra i Oracle JDBC-dokumentet, särskilt kapitlet Arbeta med Oracle-objekttyper.

Först är en inställning som liknar din:

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

Detta är java-proceduren:

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

Låt oss kalla det:

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


  1. Hur Group_Concat() fungerar i SQLite

  2. Dominoernas hemligheter, eller en dominospeldatamodell

  3. Följ med mig tisdagen den 9 april för de senaste Microsoft Access-nyheterna

  4. ODBC-anrop misslyckades med lagrad procedur - Skicka igenom förfrågan