- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,如果这是一个愚蠢的问题,我必须道歉,但我是 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/
我是一名优秀的程序员,十分优秀!