Я знаю, что это может быть повторяющийся вопрос, я проверил несколько связанных решений и не смог продолжить работу.
У меня мало вопросов по передаче целочисленного списка из Java и его использованию в Oraclefunction.
Список операторов передается функции оракула из 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 и перейти к таблице для получения результатов.
Ожидаемый результат - несколько строк извыберите заявление
Любые указатели и предложения высоко ценятся.Спасибо:)