描述:尝试创建返回 oracle 数组类型的网关服务调用。专门获取 sys.dbmsoutput_linesarray。当我注册 OUT 参数或可能在服务中时,我得到的错误似乎是我的配置有问题。想知道是否有人可以告诉我我做错了什么?
错误信息: 可调用语句回调; SQL 的未分类 SQLException [{call GET_DBMS_OUTPUT(?)}]; SQL状态[99999];错误代码 [17004];列类型无效:1111;嵌套异常是 java.sql.SQLException:无效的列类型:1111
我尝试在 spring 集成中做的引用代码示例: JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT EXAMPLE
Oracle 12c - PL SQL 函数:
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 示例 stored-procedure-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 - 更新的字符串转换服务
public interface StringConversionService {
/**
* Converts a String to Upper Case.
*
* @param stringToConvert The string to convert to upper case
* @return The converted upper case string.
*/
String convertToUpperCase(String stringToConvert);
Integer getNumber();
@Payload("new java.util.Date()")
String[] getLines();
}
JAVA - 主要
final StringConversionService service = context.getBean(StringConversionService.class);
System.out.println("Calling Stored Proc");
String[] dbmsLines = service.getLines();
更新: Spring 配置: - 为 SqlReturnArray 添加了一个 bean。 - 为 SqlReturnArray bean 的引用添加了返回类型 - 将 StringConversionService 更改为使用 String[] 而不是 oracle Array 返回类型。 - 更新了主类以获取 String[]
最佳答案
你必须添加 return-type
并像 SqlReturnArray
一样实现它:
<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" />
sqlReturnArray
是 SqlReturnArray
的 bean。
当然,已经将结果作为 String[]
处理,而不是那里不可用的 ARRAY
。
关于java - Spring Integration - 无法检索 Oracle 数组 OUT PARAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42324142/