繁体   English   中英

如何将键值传递给PL / SQL过程?

[英]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.odciobjectsys.odciobjectlist ,因为这将为您提供类似的设置。 但是使用自己的类型仍然比较安全,以防将来系统更改,或者更有可能您的需求更改为需要更长的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM