Передача списка целых чисел из Java в функцию Oracle - PullRequest
0 голосов
/ 01 февраля 2019

Я знаю, что это может быть повторяющийся вопрос, я проверил несколько связанных решений и не смог продолжить работу.

У меня мало вопросов по передаче целочисленного списка из Java и его использованию в Oraclefunction.

  1. Список операторов передается функции оракула из Java в следующем формате: '11111, 22222'.11111 и 22222 являются числами, но в одинарных кавычках, так что они передаются как одна переменная.Есть ли лучший способ передать эту переменную?

    Фрагмент Java:

    List<Integer> operatorList = new ArrayList<>();
    

, изменяющий operatorList для включения одинарных кавычек в началеи конец и переход к функции.-> не уверен, что это правильный подход

userOrgList = sessionFactory.getCurrentSession().createSQLQuery
            ("SELECT message FROM TABLE (FUNC_GetMessages(**:operatorList**))")
                                    .setParameter("operatorList", inputOperatorList)
                                    .setFetchSize(5000).list();
В Oracle, как я и ожидал,

SELECT Message FROM TABLE (FUNC_GetMessages('11111, 22222'));

, чтобы я мог удалить кавычки и передать значение непосредственно в качестве параметра в таблицу.

Тип создан для обработки этого параметра.

Oracle:

create or replace TYPE OPERATOR_ARRAY_DEL AS TABLE OF INTEGER;
/

create or replace FUNCTION FUNC_GetMessages (
    OperatorList IN VARCHAR2
)   

RETURN T_MSGTABLE AS
vMsg_List       T_MSGTABLE;
v_Operator_List VARCHAR(50);
v_operatorList    VARCHAR(100) :='';
v_operatorFinalList    VARCHAR(100) ;
v_operatorId     VARCHAR(20);
v_operatorFinal OPERATOR_ARRAY_DEL := OPERATOR_ARRAY_DEL();
BEGIN

FOR iOperator IN 
        (SELECT to_number(column_value) as v_operatorId FROM xmltable(OperatorList)) 
        LOOP
        v_operatorList := v_operatorList  ||  iOperator.v_operatorId || ',';

        SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorFinalList FROM DUAL; 

  END LOOP;   

... some code here
...
....

  SELECT SUBSTR(v_operatorList, 1, LENGTH(v_operatorList) - 1) INTO v_operatorList FROM DUAL;   

    SELECT T_MSGTABLE( message) 
    BULK COLLECT INTO vSMs_List
    FROM 
    (  
        SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN (v_operatorFinalList);
    );
END;    

Выполнение функции:

SELECT Message FROM TABLE (FUNC_GetMessages('11111, 22222')); --> Error here : Invalid number

ORA-01722: invalid number
ORA-06512: at "FUNC_GetMessages", line 29
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

Я не уверен, как интерпретировать operatorList и перейти к таблице для получения результатов.

Ожидаемый результат - несколько строк извыберите заявление

Любые указатели и предложения высоко ценятся.Спасибо:)

1 Ответ

0 голосов
/ 01 февраля 2019

Вероятно, есть более простой способ сделать это на Java, но вы также слишком усложняете вещи в своей функции.Этот запрос xmltable преобразует ваш список в таблицу, которую вы можете перебирать - нет необходимости снова помещать его в varchar2.

create or replace FUNCTION FUNC_GetMessages (
    OperatorList IN VARCHAR2
)   
RETURN T_MSGTABLE AS
  vMsg_List       T_MSGTABLE;
BEGIN 

... some code here
...
....

    SELECT T_MSGTABLE( message) 
    BULK COLLECT INTO vMsg_List
    FROM 
    (  
        SELECT MESSAGE FROM MESSAGETABLE WHERE OPERATOR IN 
          (SELECT to_number(column_value) as opId FROM xmltable(OperatorList));
    );
END;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...