如何使用骆驼路径输入数组作为oracle存储过程的输入参数
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.CamelExecutionException:在交易所执行期间发生异常:Exchange [ID-lenovo1-vb-local-1561605833377-0-1] 在org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1846)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.builder.SimpleBuilder.createExpression(SimpleBuilder.java:117)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.builder.SimpleBuilder.evaluate(SimpleBuilder.java:90)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.SetHeaderProcessor.process(SetHeaderProcessor.java:52)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.Pipeline.process(Pipeline.java:138)[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.Pipeline.process(Pipeline.java:101)[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.component.stream.StreamConsumer.processLine(StreamConsumer.java:252)[camel-stream-2.22.5.jar:2.22.5] 在org.apache.camel.component.stream.StreamConsumer.readFromStream(StreamConsumer.java:216)[camel-stream-2.22.5.jar:2.22.5] 在org.apache.camel.component.stream.StreamConsumer.run(StreamConsumer.java:120)上[camel-stream-2.22.5.jar:2.22.5] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[na:1.8.0_191] 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)[na:1.8.0_191] 在java.lang.Thread.run(Thread.java:748)[na:1.8.0_191]
起因:org.apache.camel.language.simple.types.SimpleIllegalSyntaxException:未知函数:位置为0的数组 $ {array} * 在org.apache.camel.language.simple.SimpleExpressionParser.parseExpression(SimpleExpressionParser.java:67)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.SimpleLanguage.createExpression(SimpleLanguage.java:186)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.SimpleLanguage.createExpression(SimpleLanguage.java:220)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.builder.SimpleBuilder.createExpression(SimpleBuilder.java:115)〜[camel-core-2.22.5.jar:2.22.5] ...省略了14个共同的框架
起因:org.apache.camel.language.simple.types.SimpleParserException:未知函数:array 在org.apache.camel.language.simple.ast.SimpleFunctionExpression.createSimpleExpression(SimpleFunctionExpression.java:256)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.ast.SimpleFunctionExpression.createExpression(SimpleFunctionExpression.java:58)〜[camel-core-2.22.5.jar:2.22.5]在org.apache.camel.language.simple处。 ast.SimpleFunctionStart.doCreateLiteralExpression(SimpleFunctionStart.java:68)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.ast.SimpleFunctionStart.createExpression(SimpleFunctionStart.java:58)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.SimpleExpressionParser.createExpressions(SimpleExpressionParser.java:174)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.SimpleExpressionParser.doParseExpression(SimpleExpressionParser.java:97)〜[camel-core-2.22.5.jar:2.22.5] 在org.apache.camel.language.simple.SimpleExpressionParser.parseExpression(SimpleExpressionParser.java:64)〜[camel-core-2.22.5.jar:2.22.5] ...省略了17个常见框架
答案 0 :(得分:1)
我必须进行以下更改才能使其正常运行。谢谢贝德拉。
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");