簡體   English   中英

駱駝sql存儲的java,不能輸入數組作為oracle存儲過程的輸入參數

[英]camel sql-stored java, cannot enter array as an input parameter for oracle stored-procedure

如何使用駱駝路線輸入數組作為oracle存儲過程的輸入參數

  • 數據庫:Oracle XE 11G,表:hr.DEPARTMENTS示例pl / sql,在數組{“ Administration”,“ Marketing”}中發送departments_name期望得到department_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.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] at org.apache.camel.builder.SimpleBuilder.evaluate(SimpleBuilder.java:90)〜[camel-core-2.22.5.jar:2.22.5] at 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(Pi peline.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.component.stream的org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)[camel-core-2.22.5.jar:2.22.5]。位於org.apache.camel.component.stream.StreamConsumer.readFromStream(StreamConsumer.java:216)的StreamConsumer.processLine(StreamConsumer.java:252)[camel-stream-2.22.5.jar:2.22.5] [camel-stream -2.22.5.jar:2.22.5],位於org.apache.camel.component.stream.StreamConsumer.run(StreamConsumer.java:120)[java.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.builder.SimpleBuilder上的org.apache.camel.language.simple.SimpleLanguage.createExpression(SimpleLanguage.java:220)〜[camel-core-2.22.5.jar:2.22.5] .createExpression(SimpleBuilder.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.createSimpleExpression(SimpleFunctionExpression.java:256)處的數組〜[camel-core-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] at org.apache.camel.language.simple.ast上的org.apache.camel.language.simple.ast.SimpleFunctionStart.doCreateLiteralExpression(SimpleFunctionStart.java:68)〜[camel-core-2.22.5.jar:2.22.5] .SimpleFunctionStart.createExpression(SimpleFunctionStart.java:58)〜[camel-core-2.22.5.jar:2.22.5] at org.apache.camel.language.simple.SimpleExpressionParser.createExpressions(SimpleExpressionParser.java:174)〜[ camel-core-2.22.5.jar:2.22.5] at org.apache.camel.language.simple.SimpleExpressionParser.doParseExpression(SimpleExpressionParser.java:97)〜[camel-core-2.22.5.jar:2.22.5 ] org.apache.camel.language.simp le.SimpleExpressionParser.parseExpression(SimpleExpressionParser.java:64)〜[camel-core-2.22.5.jar:2.22.5] ...省略了17個常見框架

我必須進行以下更改才能使其正常運行。 感謝Bedla。

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");    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM