如何将列表从java传递到Oracle过程?

如何将列表从java传递到Oracle过程?,java,oracle,plsql,Java,Oracle,Plsql,我想将一个列表从java发送到Oracle过程。 例如,, 有一所学校,学校有学生名单。 此外,学生们还有一个讲座列表。 我创建了一个讲座列表, 还有一份有讲座名单的学生名单, 学校有学生名单 讲座 ArrayList<String> lecture1 = new ArrayList<String>(); lecture1.add("Mat"); lecture1.add("physics"); ArrayList<String> l

我想将一个列表从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=newArrayList();
第1课添加(“Mat”);
第1课添加(“物理”);
ArrayList 2=新的ArrayList();
第2课添加(“英语”);
第2课添加(“西班牙语”);
ArrayList讲师3=新建ArrayList();
讲师3.添加(“德国”);
演讲3.添加(“法语”);
讲座的名单

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讲师列表1=新建ArrayList();
讲师1.添加(讲师1);
讲师1.添加(讲师3);
ArrayList讲师列表2=新的ArrayList();
讲师2.添加(讲师2);
讲师2.添加(讲师3);
还有上课的学生名单

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 StudentList=new ArrayList();
学生名单。addAll(讲师2);
学生名单。addAll(讲师2);
ArrayList StudentList2=新的ArrayList();
学生名单2.addAll(讲师1);
学生名单2.addAll(讲师名单2);
学校呢

    ArrayList<ArrayList<ArrayList<String>>> school = new ArrayList<ArrayList<ArrayList<String>>>();
    school.add(StudentList2);
    school.add(StudentList);
ArrayList学校=新建ArrayList();
学校。添加(学生名单2);
学校。添加(学生名单);
我想将“学校”发送到oracle过程。但是,我无法直接发送列表。Oracle库允许发送阵列,但我想发送列表

我怎么做这个手术?你能帮我吗


谢谢。

将列表转换为多维数组,然后您可以执行以下操作:

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;
/
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" };

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("STRINGLIST_LIST_LIST", con);

      ARRAY school = new ARRAY( des, con, newString[][][]{
        new String[][]{ l1, l3 },
        new String[][]{ l2, l3 }
      } );

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

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;
/
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" };

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("STRINGLIST_LIST_LIST", con);

      ARRAY school = new ARRAY( des, con, newString[][][]{
        new String[][]{ l1, l3 },
        new String[][]{ l2, l3 }
      } );

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

将列表转换为多维数组,然后可以执行以下操作:

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;
/
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" };

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("STRINGLIST_LIST_LIST", con);

      ARRAY school = new ARRAY( des, con, newString[][][]{
        new String[][]{ l1, l3 },
        new String[][]{ l2, l3 }
      } );

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

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;
/
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" };

      ArrayDescriptor des = ArrayDescriptor.createDescriptor("STRINGLIST_LIST_LIST", con);

      ARRAY school = new ARRAY( des, con, newString[][][]{
        new String[][]{ l1, l3 },
        new String[][]{ l2, l3 }
      } );

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

使用
toArray
将列表转换为数组,然后通过使用
toArray
将列表转换为数组,然后通过