Java BLOB和jdbc:存储过程出站网关
Tring通过以下方式调用my存储过程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-
<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>