Как передать список из Java в процедуру Oracle?
Я хочу отправить список из Java в процедуру Oracle. Например, есть школа, и в школе есть список учеников. Также у студентов есть список лекций. Я создаю список лекций и список студентов, у которых есть список лекций, а в школе есть список студентов.
Лекции.
ArrayList<String> lecture1 = new ArrayList<String>();
lecture1.add("Mat");
lecture1.add("physics");
ArrayList<String> lecture2 = new ArrayList<String>();
lecture2.add("English");
lecture2.add("Spanish");
ArrayList<String> lecture3 = new ArrayList<String>();
lecture3.add("Germany");
lecture3.add("French");
Список лекций.
ArrayList<ArrayList<String>> lectureList1 = new ArrayList<ArrayList<String>>();
lectureList1.add(lecture1);
lectureList1.add(lecture3);
ArrayList<ArrayList<String>> lectureList2 = new ArrayList<ArrayList<String>>();
lectureList2.add(lecture2);
lectureList2.add(lecture3);
И список студентов, у которых есть лекции.
ArrayList<ArrayList<String>> StudentList = new ArrayList<ArrayList<String>>();
StudentList.addAll(lectureList2);
StudentList.addAll(lectureList2);
ArrayList<ArrayList<String>> StudentList2 = new ArrayList<ArrayList<String>>();
StudentList2.addAll(lectureList1);
StudentList2.addAll(lectureList2);
И школа
ArrayList<ArrayList<ArrayList<String>>> school = new ArrayList<ArrayList<ArrayList<String>>>();
school.add(StudentList2);
school.add(StudentList);
я хочу отправить "школу" на оракулу. Однако я не мог отправить список напрямую. Библиотека Oracle позволяет отправлять массив, но я хочу отправить список.
Как я могу сделать эту операцию? Не могли бы вы помочь мне.
Благодарю.
1 ответ
Решение
Преобразуйте свои списки в многомерный массив, и тогда вы сможете сделать что-то вроде:
Установка Oracle:
CREATE TYPE stringlist AS TABLE OF VARCHAR2(100);
/
CREATE TYPE stringlist_list AS TABLE OF stringlist;
/
CREATE TYPE stringlist_list_list AS TABLE OF stringlist_list;
/
CREATE PROCEDURE load_list (
in_list IN stringlist_list_list
)
AS
BEGIN
NULL; -- Do something with the list
END;
/
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
public class TestDatabase2 {
public static void main(String args[]){
try{
Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","username","password");
// Convert your lists to arrays using #toArray( T[] )
String[] l1 = { "Math", "Physics" };
String[] l2 = { "English", "Spanish" };
String[] l3 = { "French", "German" };
ARRAY school = new ARRAY( des, con, newString[][][]{
new String[][]{ l1, l3 },
new String[][]{ l2, l3 }
} );
ArrayDescriptor des = ArrayDescriptor.createDescriptor("STRINGLIST_LIST_LIST", con);
CallableStatement st = con.prepareCall("{ call add_school( :school )}");
// Passing an array to the procedure -
((OracleCallableStatement) st).setARRAYAtName( "school", school );
st.execute();
} catch(ClassNotFoundException | SQLException e) {
System.out.println(e);
}
}
}