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

日付のリストをJava経由でOracleDB関数に渡す

    配列をデータベース関数に渡すには、多くの方法があります。簡単なものは次のとおりです:

    まず、TABLEを作成する必要があります DBスキーマを入力します:

    CREATE TYPE DATE_ARRAY AS TABLE OF DATE;
    

    その後、FUNCTIONを作成する必要があります この新しいタイプの入力で:

    -- a dummy function just for presenting the usage of input array
    CREATE FUNCTION Date_Array_Test_Function(p_data IN DATE_ARRAY) 
    RETURN INTEGER  
    IS
        TYPE Cur IS REF CURSOR;
        MyCur cur;
    
        single_date DATE;
    BEGIN
        /* Inside this function you can do anything you wish 
            with the input parameter: p_data */
    
        OPEN MyCur FOR SELECT * FROM table(p_data);
    
        LOOP
          FETCH MyCur INTO single_date;
          EXIT WHEN MyCur%NOTFOUND;
    
          dbms_output.put_line(to_char(single_date));
        END LOOP;
    
        RETURN 0;
    
    END Date_Array_Test_Function;
    

    javaに コード次のコードを使用して、配列入力タイプでこのような関数を呼び出すことができます。

    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Types;
    
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor;
    
    public class Main 
    {           
        public static void main(String[] args) throws SQLException 
        {
            Connection c = DriverManager.getConnection(url, user, pass);
    
            String query = "begin ? := date_array_test_function( ? ); end;";
    
            // note the uppercase "DATE_ARRAY"
            ArrayDescriptor arrDescriptor = ArrayDescriptor.createDescriptor("DATE_ARRAY", c);
    
            // Test dates
            Date[] inputs = new Date[] {new Date(System.currentTimeMillis()),
                                        new Date(System.currentTimeMillis()),
                                        new Date(System.currentTimeMillis())};
    
            ARRAY array = new ARRAY(arrDescriptor, c, inputs);
    
            CallableStatement cs = c.prepareCall(query);
            cs.registerOutParameter(1, Types.INTEGER); // the return value
            cs.setObject(2, array); // the input of the function
            cs.executeUpdate();
    
            System.out.println(cs.getInt(1));
        }
    }
    

    これがお役に立てば幸いです。

    幸運



    1. MySQLクエリが強制終了されても消えない

    2. 赤方偏移で現在の合計を計算する方法

    3. laravel5の内部結合とgroupbyクエリ構文エラー

    4. jdbcを介してpostgresで配列の基本型を取得する方法