Использование массивов в качестве входных данных для вызова хранимой процедуры в Java - PullRequest
2 голосов
/ 01 апреля 2019

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

При возврате этих вызовов должен возвращаться результат хранимой процедуры, который пользователь передал в функцию.

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

Я уже поставил в качестве аргументов объект [], но я получаю сообщение об ошибке, говорящее, что «переменная XXX не определена»

Глобальная функция для вызова хранимых процедур

@Override
    public List<Object> executeArrayProcedure(String procedureName, Map<String, Object[]> inputParams, Map<String, Class> outputParams) {
        List<Object> results = new ArrayList<>();
        try {
            StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery(procedureName);
            // register parameters
            for (Entry<String, Object[]> entry : inputParams.entrySet()) {
                storedProcedure.registerStoredProcedureParameter(entry.getKey(), entry.getValue().getClass(),ParameterMode.IN);
                // set parameters   
                storedProcedure.setParameter(entry.getKey(), entry.getValue());
            }
            for (Entry<String, Class> entry : outputParams.entrySet()) {
                storedProcedure.registerStoredProcedureParameter(entry.getKey(),entry.getValue(), ParameterMode.OUT);
            }
            // execute SP
            storedProcedure.execute();
            // get result
            for (Entry<String, Class> entry : outputParams.entrySet()) {
                results.add(storedProcedure.getOutputParameterValue(entry.getKey()));
            }           
        } catch (Exception e) {
            e.printStackTrace();
        }
        return results;
    }

Сохраненная процедура сохранена в моей базе данных

CREATE OR REPLACE TYPE intArrType AS VARRAY(100) OF NUMBER;

create or replace PROCEDURE testing (t_in IN intArrType, yout OUT number) IS
  BEGIN
    yout := 0;
    FOR i IN 1..t_in.count LOOP
      yout := yout + t_in(i);
    END LOOP;
  END;

declare
 yout number;
begin
  testing(intArrType(1,2,3),yout); 
  DBMS_OUTPUT.PUT_LINE(yout); 
end;

Ошибка при прохождении Объект []

erro: org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults

ORA-06550: 
linha 1, coluna 7:\nPLS-00306: wrong number or types of arguments in call to 'testing'\n
ORA-06550: linha 1, coluna 7:\n
PL/SQL: Statement ignored\n

У вас есть какой-нибудь совет для меня?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...