[英]How should I pass key-values to a PL/SQL procedure?
首先,如果这是一个愚蠢的问题,我必须道歉,但是我是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();
我必须在oracle数据库中明确声明一个类型,这一事实使我认为必须有一种更简单的处理方法。 这些是非常原始的对象。
这是正确的解决方法,这真的是我唯一的选择吗?
这不是一个愚蠢的问题,您正在按照我的方式去做(所以,至少在我看来,这是对的!)。 您必须能够将ARRAY
类型与模式级别的集合类型相关联,因此必须使用SQL CREATE TYPE
创建它; 举例来说,它不能是包中定义的PL / SQL集合,如果可能的话,它可能会更整洁。 Oracle没有任何神奇的方法将Java数组映射到任意集合-您必须定义并关联类型,以便可以通过JDBC在可识别的流中发送数据。
我可能会考虑做的唯一不同的事情是将集合创建为表类型而不是varray
:
CREATE TYPE text_varray AS table OF myItem ;
...因此您不必限制大小; 但是元素的顺序可能很重要,只能由varray
保留。
另一种选择是使用两个varrays
,一个用于键,一个用于值,然后将两个参数传递给过程。 然后,您必须将原始的Java二维数组转换为两个单独的数组。 这样做的好处是您可以使用内置类型之一( sys.odcivarchar2list
),而不必创建自己的varray
或对象类型。 但是,由于在Java方面更加复杂,并且维护自己的类型并不是一件困难的事,这可能不值得。 如果从varray
更改为table
,则不是一种选择,因为两个列表中的元素不一定是相同顺序的。
如果对象定义中的字符串长度正确,则可能(ab)使用sys.odciobject
和sys.odciobjectlist
,因为这将为您提供类似的设置。 但是使用自己的类型仍然比较安全,以防将来系统更改,或者更有可能您的需求更改为需要更长的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.