我在解决这个问题上非常接近,但我显然错过了一些东西.我的要求是从JDBC调用Oracle中的存储过程.存储过程将1个用户定义的Oracle对象作为INput,将另一个用户定义的Oracle对象作为OUTput.INput和OUTput对象混合了原始Oracle数据类型和另一组用户定义对象的集合.只要我为INput和OUTput对象中的集合类型设置NULL,我就能成功调用存储过程并返回结果.如果我尝试为Oracle对象列表创建ArrayDescriptor以将其发送到存储过程,我会不断遇到障碍.所以我需要帮助弄清楚如何将Array设置为INput对象并将其设置为CallableStatement.请注意,我知道如何将原始类型和数组作为直接输入发送到存储过程.但我不想这样做,因为我们以后必须向程序发送10个额外的字段,我不想将它们添加到方法签名中.这是课程列表.此外,下面的代码没有编译错误.
在oracle中打包:
CREATE OR REPLACE PACKAGE testPkg AS
PROCEDURE spGetTestData (
TESTDATA_IN IN TESTDATA_IN_OBJ,
TESTDATA_OUT OUT TESTDATA_OUT_OBJ
);
END;
Run Code Online (Sandbox Code Playgroud)
存储过程的输入对象:
CREATE OR REPLACE TYPE TESTDATA_IN_OBJ AS OBJECT(
testStr1 VARCHAR2(5),
arrObj1 ARR_OBJ_1_NT);
Run Code Online (Sandbox Code Playgroud)
Array对象作为INput对象的一部分:
create or replace TYPE ARR_OBJ_1_NT AS TABLE OF ARR_OBJ_1_OBJ;
Run Code Online (Sandbox Code Playgroud)
INput对象的UserDefined对象部分:
CREATE OR REPLACE TYPE ARR_OBJ_1_OBJ AS OBJECT
(
teststr VARCHAR2(14),
testNumber NUMBER(4),
);
Run Code Online (Sandbox Code Playgroud)
TestDataINObj.java:
import java.sql.Array;
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;
public class TestDataINObj implements SQLData
{
private String sql_type = "TESTDATA_IN_OBJ"; …Run Code Online (Sandbox Code Playgroud)