верблюжий sql-сохраненный Java, не может ввести массив в качестве входного параметра для хранимой процедуры оракула - PullRequest
0 голосов
/ 27 июня 2019

как использовать верблюжий маршрут для ввода массива в качестве входного параметра хранимой процедуры oracle

  • база данных: Oracle XE 11G, таблица: hr.DEPARTMENTS пример pl / sql, отправка кафедры_name в массиве {"Administration"," Marketing "} ожидайте получения суммы департаментов_ *. 1004 *

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: Exceptionпроизошло во время выполнения на обмене: 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] at 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) ~ [верблюд-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] в орг.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 $ {массив} *в 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: Неизвестная функция: массив в 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 (SimpleFunction.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 общих кадров пропущено

1 Ответ

1 голос
/ 05 июля 2019

Я должен внести следующие изменения, чтобы он заработал.Спасибо за Бедла.

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