Java 我应该如何将键值传递给PL/SQL过程?

Java 我应该如何将键值传递给PL/SQL过程?,java,sql,oracle,plsql,Java,Sql,Oracle,Plsql,首先,如果这是一个愚蠢的问题,我必须道歉,但我是PL/SQL新手 我正在从事一个项目,该项目需要使用java和PL/SQL与Oracle数据库进行一些交互。我有一个不确定的键值列表,我想传递给数据库,我最初的研究似乎指向oracle.sql.STRUCT和oracle.sql.ARRAY 我并不完全支持STRUCT和ARRAY对象,因为它们需要数据库端的现有对象/表类型 编辑: 在我的pl/sql中 CREATE OR REPLACE TYPE myItem AS object (c1 VARC

首先,如果这是一个愚蠢的问题,我必须道歉,但我是PL/SQL新手

我正在从事一个项目,该项目需要使用java和PL/SQL与Oracle数据库进行一些交互。我有一个不确定的键值列表,我想传递给数据库,我最初的研究似乎指向oracle.sql.STRUCT和oracle.sql.ARRAY

我并不完全支持STRUCT和ARRAY对象,因为它们需要数据库端的现有对象/表类型

编辑:

在我的pl/sql中

CREATE OR REPLACE TYPE myItem AS object (c1 VARCHAR2(10), c2 VARCHAR2(30)); 
CREATE OR REPLACE TYPE text_table AS TABLE OF myItem ;
在我的java代码中

java.sql.Connection connection = myGetConnection();
// create variables for the oracle.sql.ARRAY
ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor("TEXT_TABLE", connection);
Object[] arrayObject = new Object[2];

//create STRUCT objects
StructDescriptor descriptor = StructDescriptor.createDescriptor("MYITEM", connection);

// Loop through the map and put objects in the arrayObject
for(int i = 0; i < myMap.size(); i++){
String key = "key"+1;
String value = "value"+2;
Object[] obj = {key,value};
STRUCT structObj = new STRUCT(descriptor, connection, obj);

// put the struct object in the array object
arrayObject[i] = structObj;
}

// create the oracle.sql.ARRAY
ARRAY array = new ARRAY(arraydesc, connection, arrayObject);

//..
oracleCallableStatement = connection.prepareCall("{call myPackage.myProcedure(?)}");
oracleCallableStatement.setArray(1, array);
oracleCallableStatement.execute();
oracleCallableStatement.close();
java.sql.Connection Connection=myGetConnection();
//为oracle.sql.ARRAY创建变量
ArrayDescriptor arraydesc=ArrayDescriptor.createDescriptor(“文本表”,连接);
Object[]arrayObject=新对象[2];
//创建结构对象
StructDescriptor=StructDescriptor.createDescriptor(“MYITEM”,连接);
//在贴图中循环并将对象放入arrayObject
对于(int i=0;i
我必须在我的oracle数据库中声明一个类型,这一事实使我认为一定有一种更简单的方法。这些是非常原始的物体


这是正确的方法吗?这真的是我唯一的选择吗?

这不是一个愚蠢的问题,而你正按照我的方式去做(所以我认为这至少是正确的!)。您必须能够将
数组
类型与架构级集合类型相关联,因此必须使用SQL
创建类型
创建该类型;它不能是在包中定义的PL/SQL集合,比如说,如果可能的话,这可能会更整洁一些。Oracle没有神奇的方法将Java数组映射到任意集合—您必须定义并关联类型,以便可以通过JDBC以可识别的流发送数据

<> >我唯一可以考虑做的不同的是将集合创建为表类型,而不是<代码> VARAME>代码>:

CREATE TYPE text_varray AS table OF myItem ;
。。。因此,您不必限制大小;但是元素的顺序可能很重要,并且仅由
varray
保留

另一个选项是使用两个
varray
,一个用于键,一个用于值,并向过程传递两个参数;然后必须将原始Java二维数组转换为两个单独的数组。这样做的好处是,您可以使用其中一种内置类型,而不必创建自己的
varray
或对象类型。但由于Java方面更为复杂,维护自己的类型也不是那么困难,因此可能不值得这么做;如果您从
varray
更改为
table
,则这不是一个选项,因为元素在两个列表中的顺序不一定相同

如果对象定义中的字符串长度正确,则可以使用(ab),因为这将提供类似的设置;但使用自己的类型更安全,以防将来系统类型发生变化,或者您的需求发生变化,需要更长的字符串