Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przekazywanie listy dat do funkcji Oracle db przez java

Przekazywanie tablicy do funkcji bazy danych ma wiele sposobów. Prosty jest następujący:

Najpierw powinieneś utworzyć TABLE wpisz w schemacie bazy danych:

CREATE TYPE DATE_ARRAY AS TABLE OF DATE;

Następnie powinieneś napisać FUNCTION z tym nowym typem danych wejściowych:

-- 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;

Teraz w java kod możesz użyć następującego kodu, aby wywołać taką funkcję z tablicowym typem wejściowym:

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));
    }
}

Mam nadzieję, że to będzie pomocne.

Powodzenia



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywołanie procedury składowanej z kursorami zgłasza niepoprawny wyjątek nazwy kolumny

  2. Jak mogę uzyskać tylko pierwszy wiersz w zestawie wyników PO złożeniu zamówienia?

  3. Odejmowanie dat Oracle

  4. Nie możesz użyć zapytania LIKE w PreparedStatement JDBC?

  5. jaki jar jdbc użyć z oracle 11g i jdk 1.6 i jak podłączyć się do samego db