ORA-22922:将CLOB作为UDT数组的一部分传递时,LOB值不存在

时间:2018-10-08 14:55:04

标签: java oracle jdbc jdbctemplate

我试图将用户定义类型(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);

找到解决方案后就结束了这个问题。

1 个答案:

答案 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(?,?,?,?,?,?,?,?)}");