Java Spring集成-检索Oracle阵列输出参数失败
说明:尝试创建返回oracle阵列类型的网关服务调用。特别是获取sys.dbmsoutput_linesarray。当我注册OUT参数或可能在服务中注册OUT参数时,下面出现的错误似乎表明我的配置有问题。不知是否有人能告诉我我做错了什么 错误消息: CallableStatementCallback;SQL[{call GET_DBMS_OUTPUT(?)}]的未分类SQLException;SQL状态[99999];错误代码[17004];无效列类型:1111;嵌套异常为java.sql.SQLException:列类型无效:1111 我在spring集成中尝试执行的参考代码示例: Oracle 12c-PL SQL函数:Java Spring集成-检索Oracle阵列输出参数失败,java,spring-integration,Java,Spring Integration,说明:尝试创建返回oracle阵列类型的网关服务调用。特别是获取sys.dbmsoutput_linesarray。当我注册OUT参数或可能在服务中注册OUT参数时,下面出现的错误似乎表明我的配置有问题。不知是否有人能告诉我我做错了什么 错误消息: CallableStatementCallback;SQL[{call GET_DBMS_OUTPUT(?)}]的未分类SQLException;SQL状态[99999];错误代码[17004];无效列类型:1111;嵌套异常为java.sql.SQ
create or replace function get_dbms_output
return dbmsoutput_linesarray
as
l_output dbmsoutput_linesarray;
l_linecount number;
begin
dbms_output.enable;
dbms_output.put_line('This is a line');
dbms_output.put_line('This is another line');
dbms_output.put_line('This is the last line.');
dbms_output.get_lines(l_output, l_linecount);
if l_output.count > l_linecount then
-- Remove the final empty line above l_linecount
l_output.trim;
end if;
return l_output;
end get_dbms_output;
Spring上下文文件-取自Spring集成git hub示例存储过程oracle。示例代码使用以下出站网关进行了扩充
<bean id="sqlReturnArray" class="org.springframework.data.jdbc.support.oracle.SqlReturnArray"></bean>
<int-jdbc:stored-proc-outbound-gateway
id="outbound-gateway-function-dbms" request-channel="procedureDBMSRequestChannel"
data-source="dataSource"
stored-procedure-name="get_dbms_output"
expect-single-result="true">
<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />
</int-jdbc:stored-proc-outbound-gateway>
JAVA-MAIN
final StringConversionService service = context.getBean(StringConversionService.class);
System.out.println("Calling Stored Proc");
String[] dbmsLines = service.getLines();
更新:
弹簧配置:
-为SqlReturnArray添加了一个bean。
-添加了对SqlReturnArray bean的引用的返回类型
-将StringConversionService更改为使用字符串[]而不是oracle数组返回类型。
-更新主类以获取字符串[]您必须添加并以某种方式实现它,如:
其中sqlReturnArray
是该sqlReturnArray
的一个bean
当然,将结果处理为一个
字符串[]
,而不是一个不可用的数组
您是否总是必须为OUT参数使用返回类型?在示例中,它似乎并不总是使用它。这是因为Spring在封面下使用JDBC元数据来确定返回的内容吗?不,您必须将它用于非标准、复杂类型的spring数据JDBCCore1.2。现在得到一个spring上下文错误,现在将其添加到上面。无法解析对bean“#{new org.springframework.data.jdbc.support.oracle.SqlReturnArray()}”的引用。。。在设置参数时;org.springframework.expression.spel.SpelEvaluationException:EL1003E:(位置0):尝试构造“org.springframework.data.jdbc.support.oracle.SqlReturnArray”“using arguments”“()”类型的对象时出现问题哦!对不起,我的错。这应该是一个bean引用。我编辑了我的回答,但仍然得到了与我最初在帖子中相同的错误。我用我们讨论过的编辑更新了我的原始帖子。您提到将结果作为字符串[]处理。这应该是服务调用的返回类型吗?或者应该是数组之类的东西?
final StringConversionService service = context.getBean(StringConversionService.class);
System.out.println("Calling Stored Proc");
String[] dbmsLines = service.getLines();
<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />