ORA-22922: несуществующее значение LOB при передаче CLOB как части массива UDT - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь передать пользовательский тип (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 голосов
/ 08 октября 2018

Решение : нам нужно создать clob, используя то же соединение, которое используется для создания оператора вызова

В этом случае сгусток был создан с использованием con объект.Но вызываемый оператор был создан без использования con object

Следующее

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