camel sql存储java,无法输入数组作为oracle存储过程的输入参数
如何使用驼峰路由输入数组作为oracle存储过程的输入参数 数据库:Oracle XE 11G,表:人力资源部门 示例pl/sql, 正在发送数组{管理,营销}中的部门名称 期望得到部门id的总和。 1创建嵌套表类型:camel sql存储java,无法输入数组作为oracle存储过程的输入参数,java,arrays,oracle,stored-procedures,apache-camel,Java,Arrays,Oracle,Stored Procedures,Apache Camel,如何使用驼峰路由输入数组作为oracle存储过程的输入参数 数据库:Oracle XE 11G,表:人力资源部门 示例pl/sql, 正在发送数组{管理,营销}中的部门名称 期望得到部门id的总和。 1创建嵌套表类型: create or replace TYPE "NAME_TYPE" IS TABLE OF VARCHAR2(4000) 2创建一个存储过程: create or replace PROCEDURE test_departments_array ( p_dep_n
create or replace TYPE "NAME_TYPE" IS TABLE OF VARCHAR2(4000)
2创建一个存储过程:
create or replace PROCEDURE test_departments_array
( p_dep_names IN NAME_TYPE,
r_dep_id_sum OUT INTEGER )
AS
r_dep_id INTEGER;
BEGIN
r_dep_id_sum :=0;
FOR i IN p_dep_names.first .. p_dep_names.last
LOOP
select d.department_id into r_dep_id
from hr.departments d where d.department_name=p_dep_names(i);
r_dep_id_sum := r_dep_id_sum + r_dep_id;
DBMS_OUTPUT.put_line('input:'||p_dep_names(i));
END LOOP;
END test_departments_array;
3客户代码:证明程序有效
declare
in_values NAME_TYPE := NAME_TYPE('Administration','Marketing');
out_value INTEGER;
begin
hr.test_departments_array(
p_dep_names => in_values,r_dep_id_sum => out_value);
DBMS_OUTPUT.put_line('output:'||out_value);
end;
4输出:
投入:管理
投入:营销
产出:30
5 java代码:
package test.camel.javadsl;
import java.sql.Array;
import javax.sql.DataSource;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import oracle.jdbc.driver.OracleConnection;
@Component
public class JavaDslRouteBuilder extends RouteBuilder {
@Autowired
DataSource dataSource;
@Override
public void configure() throws Exception {
final OracleConnection conn= (OracleConnection)dataSource.getConnection();
String[] values = {"Administration0","Marketing"};
Array array = conn.createOracleArray("NAME_TYPE", values);;
from("stream:in?promptMessage=Enter to start:")
.setHeader("p_dep_names",simple( "${array}"))
.to("sql-stored:QUERY_DEPARTMENTS_ARRAY(ARRAY ${header.p_dep_names})");
}
}
6错误信息:
org.apache.camel.cameleExecutionException:在exchange上执行时发生异常:exchange[ID-lenovo1-vb-local-156160583377-0-1]
位于org.apache.camel.util.ObjectHelper.wrapCamelExecutionExceptionObjectHelper.java:1846~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.builder.SimpleBuilder.createExpressionSimpleBuilder.java:117~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.builder.SimpleBuilder.evaluateSimpleBuilder.java:90~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.processor.SetHeaderProcessor.processSetHeaderProcessor.java:52~[camel-core-2.22.5.jar:2.22.5]
java:548~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.processor.CamelInternalProcessor.processCamelInternalProcessor.java:201[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.processor.Pipeline.processPipeline.java:138[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.processor.Pipeline.processPipeline.java:101[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.processor.CamelInternalProcessor.processCamelInternalProcessor.java:201[camel-core-2.22.5.jar:2.22.5]
位于org.apache.camel.processor.DelegateAsyncProcessor.processDelegateAsyncProcessor.java:97[camel-core-2.22.5.jar:2.22.5]
位于org.apache.camel.component.stream.StreamConsumer.processLineStreamConsumer.java:252[camel-stream-2.22.5.jar:2.22.5]
在org.apache.camel.component.stream.StreamConsumer.readfromStreamconsumer.java:216[camel-stream-2.22.5.jar:2.22.5]
在org.apache.camel.component.stream.StreamConsumer.runStreamConsumer.java:120[camel-stream-2.22.5.jar:2.22.5]
位于java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1149[na:1.8.0¿]
位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:624[na:1.8.0_191]
java:748[na:1.8.0_191]
原因:org.apache.camel.language.simple.types.SimpleIllegalSyntaxException:未知函数:位置0处的数组
${array}
*
在org.apache.camel.language.simple.SimpleExpressionParser.parseExpressionSimpleExpressionParser.java:67~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.language.simple.SimpleLanguage.createExpressionSimpleLanguage.java:186~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.language.simple.SimpleLanguage.createExpressionSimpleLanguage.java:220~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.builder.SimpleBuilder.createExpressionSimpleBuilder.java:115~[camel-core-2.22.5.jar:2.22.5]
... 省略14个公共框架
原因:org.apache.camel.language.simple.types.SimpleParserException:未知函数:数组
在org.apache.camel.language.simple.ast.SimpleFunctionExpression.createSimpleExpressionSimpleFunctionExpression.java:256~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.language.simple.ast.SimpleFunctionExpression.createExpressionSimpleFunctionExpression.java:58~[camel-core-2.22.5.jar:2.22.5]在org.apache.camel.language.simple.ast.SimpleFunctionStart.doCreateLiteralExpressionSimpleFunctionStart.java:68~[camel-core-2.22.5.jar:2.22.5]
在org.apache.camel.language.simple.ast.SimpleFunctionStart.createExpressionSimpleFunctionStart.java:58~[camel-core-2.22.5.jar:2.22.5]
位于org.apache.camel.language.simple.SimpleExpressionParser.createExpressionSimpleExpressionParser.java:174~[camel-core-2.22.5.jar:2.22.5]
位于org.apache.camel.language.simple.SimpleExpressionParser.doParseExpressionSimpleExpressionParser.java:97~[camel-core-2.22.5.jar:2.22.5]
位于org.apache.camel.language.simple.SimpleExpressionParser.parseExpressionSimpleExpressionParser.java:64~[camel-core-2.22.5.jar:2.22.5]
... 省略17个公共框架
我必须进行以下更改才能使其正常工作。谢谢贝德拉
ARRAY array = (ARRAY) conn.createOracleArray("NAME_TYPE", values);
from("timer://runOnce?repeatCount=1&delay=1000")
.setHeader("p_dep_names", constant(array)) // Used constant to pass array reference instead of simple
.to("sql-stored:TEST_DEPARTMENTS_ARRAY(ARRAY 'NAME_TYPE' ${header.p_dep_names}, OUT INTEGER r_dep_id_sum )") // Used 'NAME_TYPE'
.to("log:stream");
这不是简单语言的工作方式。康斯坦塔雷,你的名字是什么?谢谢贝德拉的建议。我不是一个经常编辑,不明白为什么要投反对票。也许说明我的研究工作太长了?所以我在第一行列出的问题不清楚?太糟糕了,我现在不能编辑我的问题。我对这个问题投了否决票,因为这个问题格式不好,很难阅读。现在,用一个名为“Now”的“horse”进行编辑后,就可以了,我已经删除了DownVoteTank,用于重新格式化使用过程,我必须执行以下操作 .processnew Processor{@Override public void processExchange exchange引发异常{String[]values={Administration0,Marketing};数组=数组conn.createOracleArrayNAME_TYPE,values;exchange.getIn.setBodyarray;}。setHeaderp_dep_names,simple${body}