camel sql存储java,无法输入数组作为oracle存储过程的输入参数

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

如何使用驼峰路由输入数组作为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_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}