我试图将用户定义类型(UDT)作为输入参数传递给Oracle存储过程
UDT数组- FILTER_EXPR_TBL :
CREATE OR REPLACE
TYPE schema.FILTER_EXPR_TBL AS TABLE OF schema.FILTER_EXPR_T
UDT成员- FILTER_EXPR_T :
CREATE OR REPLACE
TYPE schema.FILTER_EXPR_T AS OBJECT (
filter_name varchar2(50 CHAR),
Comparison_opr varchar2(50 CHAR),
Search_value clob,
logical_opr varchar2(30 CHAR)
)
我的Java代码为该UDT部分准备输入:
// Preparing filter_expr_t and adding it to an array
StructDescriptor StructDesc_Filterexpr = StructDescriptor.createDescriptor("schema.FILTER_EXPR_T", con);
Object[] ObjArray = new Object[4];
ObjArray[0] = "val1";
ObjArray[1] = "=";
oracle.jdbc.OracleClob clob = (oracle.jdbc.OracleClob) con.createClob();
clob.setString(1,"val2");
ObjArray[2] = clob;
ObjArray[3] = "";
STRUCT filter_expr = new STRUCT(StructDesc_Filterexpr, con, ObjArray);
STRUCT[] filter_expr_tbl = {filter_expr};
//Declaring filter_expr_tbl
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "schema.FILTER_EXPR_TBL", con);
ARRAY array_to_pass = new ARRAY( descriptor, con, filter_expr_tbl);
其中“ con”是OracleConnection对象
我将其添加到可调用语句中的部分:
stmnt.setArray(1, array_to_pass);
找到解决方案后就结束了这个问题。
答案 0 :(得分:0)
解决方案:我们需要使用与创建可调用语句相同的连接来创建Clob
在这种情况下,Clob是使用 con 对象创建的。但是可调用语句是在不使用 con 对象
的情况下创建的以下
OracleConnection con = (emeaJdbcTemplate.getDataSource().getConnection()).unwrap(OracleConnection.class);
OracleCallableStatement stmnt = (OracleCallableStatement) emeaJdbcTemplate.getDataSource().getConnection().prepareCall("{call pkg.proc(?,?,?,?,?,?,?,?)}");
应该是
OracleConnection con = (emeaJdbcTemplate.getDataSource().getConnection()).unwrap(OracleConnection.class);
OracleCallableStatement stmnt = (OracleCallableStatement) con.prepareCall("{call pkg.proc(?,?,?,?,?,?,?,?)}");