将数组传递给oracle程序

pal*_*laa 11 java oracle stored-procedures

我想从java发送两个数组到oracle存储过程.第一个数组是字符串数组,第二个是字符数组,我该如何制作?

Luk*_*ard 14

这是一个如何做到这一点的例子.

以下脚本在数据库中设置表,类型和存储过程.该过程采用数组类型的参数,并将数组的每一行插入表中:

CREATE TABLE strings (s VARCHAR(4000));

CREATE TYPE t_varchar2_array AS TABLE OF VARCHAR2(4000);
/

CREATE OR REPLACE PROCEDURE p_array_test(
    p_strings      t_varchar2_array
)
AS
BEGIN
  FOR i IN 1..p_strings.COUNT
  LOOP
    INSERT INTO strings (s) VALUES (p_strings(i));
  END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

然后,Java代码演示如何将数组传递到此存储过程:

import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;

public class ArrayTest {
    public static void main(String[] args) throws Exception {
        DriverManager.registerDriver(new OracleDriver());
        Connection conn = DriverManager.getConnection(
            "jdbc:oracle:thin:@localhost:1521:xe", "user", "pass");

        CallableStatement stmt = conn.prepareCall("BEGIN p_array_test(?); END;");

        // The first parameter here should be the name of the array type.
        // It's been capitalised here since I created it without using
        // double quotes.
        ArrayDescriptor arrDesc =
            ArrayDescriptor.createDescriptor("T_VARCHAR2_ARRAY", conn);

        String[] data = { "one", "two", "three" };
        Array array = new ARRAY(arrDesc, conn, data);
        stmt.setArray(1, array);
        stmt.execute();

        conn.commit();
        conn.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果运行SQL脚本然后运行Java类,然后查询表strings,则应该发现所有数据都已插入表中.

当你说'一个字符数组'时,我猜你的意思是一个Java数组char.如果我猜对了,那么我认为你最好将chars 转换为s String然后使用与上面相同的方法.