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

Posted

技术标签:

【中文标题】如何将列表从 java 传递到 Oracle 过程?【英文标题】:How to pass List from java to Oracle Procedure? 【发布时间】:2016-09-06 17:12:18 【问题描述】:

我想将一个列表从 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);

我想将“school”发送到 oracle 程序。但是我无法直接发送列表。 Oracle 库允许发送数组,但我想发送列表。

我该如何做这个操作?你能帮帮我吗?

谢谢。

【问题讨论】:

使用toArray将列表转换为数组,然后通过 【参考方案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" ;

      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 传递到 Oracle 过程?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将数组从java传递到oracle中的存储过程

java.sql.SQLException同时将变量从java传递到oracle过程

将数组传递给 oracle 过程

将变量从 Access(前端)传递到 Oracle(后端)存储过程

将数据集从 Oracle PL/SQL 传递到 Java 的适当方法

从 Oracle 存储过程中检索数组列表 - Java