gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:44:36 27 4
gpt4 key购买 nike

首先,如果这是一个愚蠢的问题,我必须道歉,但我是 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 保留。

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

如果对象定义中的字符串长度正确,您可能会(ab)使用 sys.odciobject and sys.odciobjectlist ,因为这会给你一个类似的设置;但使用您自己的类型仍然更安全,以防系统将来发生变化,或者更有可能您的需求更改为需要更长的字符串。

关于java - 我应该如何将键值传递给 PL/SQL 过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26055530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com