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

JDBCを使用してストアドプロシージャからOracleテーブルタイプを取得します

    JavaからPLSQLオブジェクト(ケース2および5 =パッケージレベルのオブジェクト)にアクセスすることはできません。「java-Oracleストアドプロシージャで配列を渡す」を参照してください。ただし、SQLタイプにはアクセスできます(ケース1および4)。

    PL / SQLからJavaにOUTパラメータを取得するには、OracleCallableStatementを使用してTomKyteのスレッドの1つで説明されているメソッドを使用できます。 VARCHARのテーブルではなくObjectのテーブルを取得するため、コードには追加の手順があります。

    これは、SQLオブジェクトのテーブルを使用したデモです。最初にセットアップします。

    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
    

    実際のJavaクラス(dbms_output.put_lineを使用) SQLから呼び出すため、ログに記録するには、System.out.printlnを使用します。 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
    

    それを呼びましょう:

    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. PostgreSQL8.3以降のOLTPパフォーマンス

    2. GroovySQLOracle配列関数/プロシージャアウトパラメータの登録

    3. MySQLで列が空かnullかどうかを確認するにはどうすればよいですか?

    4. mysqlの文字列から数字のみを取得するにはどうすればよいですか?