sql >> データベース >  >> RDS >> Oracle

Javaでユーザー定義型を含むOracleストアドプロシージャを呼び出す方法は?

    Oracle SQLオブジェクトとJavaオブジェクト間のリンクを手動で設定することは、簡単な作業ではありません。特に、ユーザー定義オブジェクトの配列(またはネストされたテーブル)は、標準のデータ型の配列よりもJavaからOracleに渡すのが複雑です。つまり、署名付きのプロシージャを呼び出す方が簡単です。

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

    署名が次のようなプロシージャよりも:

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

    プロシージャのラッパーを記述して、2番目のケースを最初のケースに変換できます。

    そうは言っても、手順をマッピングすることは不可能ではありません。次の例は、主にTomKyteによる投稿に触発されています。トムは、TABLE OF NUMBERをマッピングする方法について説明します oracle.sql.ARRAYを使用する 。あなたの場合、oracle.sql.STRUCTも使用する必要があります IDSをマッピングするには SQLオブジェクト。

    Oracle JDBCドキュメント、特に「Oracleオブジェクトタイプの操作」の章を参照することもできます。

    最初はあなたと同じような設定です:

    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
    

    これはJavaプロシージャです:

    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
    

    それを呼びましょう:

    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. Excelの日付のシリアル番号を通常の日付に変換します

    2. PostgreSQL:なぜpsqlがサーバーに接続できないのですか?

    3. MySQLで小文字を大文字に変換する方法

    4. 列がnullでも空でもないAndroidSQLiteクエリ