Java BLOB和jdbc:存储过程出站网关

Java BLOB和jdbc:存储过程出站网关,java,spring,oracle,jdbc,spring-integration,Java,Spring,Oracle,Jdbc,Spring Integration,Tring通过以下方式调用my存储过程 <int:channel id="input" /> <int:channel id="output"></int:channel> <int-jdbc:stored-proc-outbound-gateway data-source="dataSource" request-channel="input" reply-channel="output" stored-procedure-

Tring通过以下方式调用my存储过程

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>
我的过程具有包含一个BLOB对象的对象集合。 当我将BLOB对象传递为null时,它可以正常工作。 但尝试使用BLOB值更新BLOB对象时,oracle错误为
“ORA-22922:不存在LOB值”

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>
在下面找到我的XML

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>
还有我的java类

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>
public class JdbcOutboundTest {
public static void main(String[] args) throws Exception {
    ApplicationContext context = new ClassPathXmlApplicationContext(
            "jdbc-outbound.xml");
    DirectChannel input = context.getBean("input", DirectChannel.class);

    DriverManagerDataSource datasour = context.getBean("dataSource",
            DriverManagerDataSource.class);

    Connection connection = datasour.getConnection();

    String s = "jjdfdjsvgkljdfskvfkldnv";
    Blob byteblob = connection.createBlob();
    byteblob.setBytes(1, s.getBytes());

    Date curDate = new Date(System.currentTimeMillis());

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
    java.sql.Date dtValue = new java.sql.Date(sdf.parse(curDate.toString())
            .getTime());
    System.out.println(dtValue);
    List<Object> java_record_array = new ArrayList<>(25);

    java_record_array.add(0, "03232323232323232");
    java_record_array.add(1, "0");
    java_record_array.add(2, "GGGG");
    java_record_array.add(3, "freefefrr343423232323");
    java_record_array.add(4, dtValue);

    java_record_array.add(5, dtValue);
    java_record_array.add(6, "edjijifk");
    java_record_array.add(7, byteblob);
    java_record_array.add(8, "MX");
    java_record_array.add(9, "Tlalpan");
    java_record_array.add(10, "XXXX");
    java_record_array.add(11, "YYYYYY");
    java_record_array.add(12, "14210");
    java_record_array.add(13, "OOOOOO");

    java_record_array.add(14, "FFFFFFF");

    java_record_array.add(15, "sdj");
    java_record_array.add(16, "sdj");
    java_record_array.add(17, "sdj");
    java_record_array.add(18, "sdj");
    java_record_array.add(19, "P");
    java_record_array.add(20, "P");

    java_record_array.add(21, "sdf");
    java_record_array.add(22, "0");
    java_record_array.add(23, "akdj");
    java_record_array.add(24, "ammhi");
    ARRAY oracle_array = (ARRAY) getObjects(java_record_array, connection);

    Message<ARRAY> message = MessageBuilder.withPayload(oracle_array)
            .build();

    input.send(message);
    // CommonDBUtil.closeDataBaseResources(connection, stmt);
}

private static oracle.sql.ARRAY getObjects(List<Object> java_record_array,
        Connection connection) {
    ARRAY body_array = null;
    Object[] java_record_array_1 = new Object[25];
    ;
    Object[] record_array = new Object[1];
    int i = 0;
    try {
        StructDescriptor recDescriptor = StructDescriptor.createDescriptor(
                "GV_OB_FIEL_CUST_DEF", connection);
        ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor(
                "GV_TB_FIEL_CUST_DEF", connection);

        for (Object obj : java_record_array) {
            java_record_array_1[i] = obj;
            i = i + 1;
        }

        STRUCT body_record = new STRUCT(recDescriptor, connection,
                java_record_array_1);
        record_array[0] = body_record;
        body_array = new ARRAY(arrayDescriptor, connection, record_array);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return body_array;
}
公共类JdbcOutboundTest{
公共静态void main(字符串[]args)引发异常{
ApplicationContext上下文=新类路径XmlApplicationContext(
“jdbc outbound.xml”);
DirectChannel输入=context.getBean(“输入”,DirectChannel.class);
DriverManager数据源dataSource=context.getBean(“数据源”,
DriverManager数据源.class);
Connection Connection=datasour.getConnection();
字符串s=“jdfdjsvgkljdfskvldnv”;
Blob byteblob=connection.createBlob();
setBytes(1,s.getBytes());
日期curDate=新日期(System.currentTimeMillis());
SimpleDataFormat sdf=新SimpleDataFormat(“yyyy-mm-dd”);
java.sql.Date dtValue=new java.sql.Date(sdf.parse(curDate.toString())
.getTime());
系统输出打印项次(dtValue);
List java_record_array=new ArrayList(25);
java_record_array.add(0,“0323232”);
java_record_array.add(1,“0”);
java_record_array.add(2,“GGGG”);
java_record_array.add(3,“freefer3434323232323”);
java_record_array.add(4,dtValue);
java_record_array.add(5,dtValue);
java_record_array.add(6,“edjifk”);
java_record_array.add(7,byteblob);
java_record_array.add(8,“MX”);
java_record_array.add(9,“Tlalpan”);
java_record_array.add(10,“XXXX”);
java_record_array.add(11,“yyyyy”);
java_record_array.add(12,“14210”);
java_record_array.add(13,“OOOOOO”);
java_record_array.add(14,“FFFFFFF”);
java_record_array.add(15,“sdj”);
java_record_array.add(16,“sdj”);
java_record_array.add(17,“sdj”);
java_record_array.add(18,“sdj”);
java_record_array.add(19,“P”);
java_record_array.add(20,“P”);
java_record_array.add(21,“sdf”);
java_record_array.add(22,“0”);
java_record_array.add(23,“akdj”);
java_record_array.add(24,“ammhi”);
数组oracle\u ARRAY=(ARRAY)getObjects(java\u record\u ARRAY,connection);
Message Message=MessageBuilder.withPayload(oracle_数组)
.build();
输入。发送(消息);
//closeDataBaseResources(连接,stmt);
}
私有静态oracle.sql.ARRAY getObjects(列出java_记录_数组,
连接(连接){
数组体\数组=null;
Object[]java_record_array_1=新对象[25];
;
对象[]记录_数组=新对象[1];
int i=0;
试一试{
StructDescriptor recDescriptor=StructDescriptor.createDescriptor(
“GV_OB_FIEL_CUST_DEF”,连接);
ArrayDescriptor ArrayDescriptor=ArrayDescriptor.createDescriptor(
“GV_TB_FIEL_CUST_DEF”,连接);
for(对象对象对象:java_记录_数组){
java_记录_数组_1[i]=obj;
i=i+1;
}
STRUCT body_record=新结构(recDescriptor、连接、,
java_记录_数组_1);
记录_数组[0]=主体_记录;
body_array=新数组(arrayDescriptor、connection、record_array);
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回体数组;
}
}

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>
请帮助解决上述问题

<int:channel id="input" />
<int:channel id="output"></int:channel>

<int-jdbc:stored-proc-outbound-gateway 
    data-source="dataSource"    request-channel="input" reply-channel="output"
    stored-procedure-name="PKG_FIEL_CUST.PRC_FIEL_UPDATE_CERT" expect-single-result="false"
    ignore-column-meta-data="true" return-value-required="false">
    <int-jdbc:sql-parameter-definition  name="iv_v_user_id"  direction="IN" type="VARCHAR"/>
    <int-jdbc:sql-parameter-definition  name="GV_TB_FIEL_CUST_DEF"  direction="IN" type="ARRAY"/>
    <int-jdbc:sql-parameter-definition name="ov_v_error_code"  direction="OUT"  />
    <int-jdbc:sql-parameter-definition name="ov_v_error_desc"  direction="OUT"  />
    <int-jdbc:parameter  name="iv_v_user_id" value="FMT" />
    <int-jdbc:parameter name="GV_TB_FIEL_CUST_DEF" expression="payload"/>       

</int-jdbc:stored-proc-outbound-gateway>
    <int:service-activator input-channel="output"  ref="jdbcHandler"></int:service-activator>