Как мне вернуть вложенную таблицу из функции оракула, используя Java? - PullRequest
2 голосов
/ 24 мая 2010

У меня есть следующее объявление типа и функция Oracle:

CREATE OR REPLACE TYPE var_outcomes_results IS TABLE OF VARCHAR2(80);

CREATE OR REPLACE FUNCTION getValuesAbove(in_nodeID IN table1.KEY_SL%TYPE,
                                          in_variable IN VARCHAR2)
    RETURN var_outcomes_results
IS
    currentID table1.KEY_SL%TYPE;
    results var_outcomes_results;
    currentIndex integer := 0;
BEGIN
    currentID := in_nodeID;

    WHILE currentID != null
    LOOP
        FOR outcomeRecord IN
            (select distinct a.PARENT, b.NAME, c.OUTCOME
             from table1 a
             left outer join table2 b on a.KEY_SL = b.KEY_SL
             left outer join table3 c on b.VAR_ID = c.VAR_ID
             where a.KEY_SL = currentID)
        LOOP
            currentID := outcomeRecord.PARENT;

            IF lower(outcomeRecord.NAME) = lower(in_variable) AND
               outcomeRecord.OUTCOME != null THEN
                currentIndex := currentIndex + 1; 
                results(currentIndex) := outcomeRecord.OUTCOME;
            END IF;
        END LOOP;
    END LOOP;

    RETURN results;
END;

У меня есть следующая функция Java:

public List<Object> getAboveValues(String variable, Integer nodeID)
{
    Connection connection = null;
    CallableStatement callableStatement = null;

    try
    {
        connection = dataSource.getConnection();
        callableStatement = connection.prepareCall("begin ? := getValuesAbove(?,?); end;");

        callableStatement.registerOutParameter(1, OracleTypes.ARRAY);
        callableStatement.setInt(2, nodeID);
        callableStatement.setString(3, variable);
        callableStatement.execute();

        System.out.println(callableStatement.getObject(1));
    }
    catch( SQLException e )
    {
        logger.error("An Exception was thrown in getAboveValues: " + e);
    }
    finally
    {
        closeDataResources(callableStatement, connection);
    }
}

Однако, когда я выполняю функцию, я получаю следующее сообщение об ошибке: «ORA-03115: неподдерживаемый сетевой тип данных или представление»

Что я делаю не так?

Любые идеи / предложения будут оценены.

Спасибо, B.J.

Ответы [ 3 ]

3 голосов
/ 24 мая 2010

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

... = connection.prepareStatement("select * from table(getValuesAbove(?,?))");

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

1 голос
/ 24 мая 2010

Если вы хотите вернуть TABLE OF VARCHAR2, вам следует использовать специфичный для Oracle код: OracleCallableStatement.registerIndexTableOutParameter вместо CallableStatement.registerOutParameter.

Поскольку для этого требуется драйвер OCI вместо тонкого драйвера, я не могу проверить этот код.

0 голосов
/ 24 мая 2014

Попробуй это.В PL / SQL есть 3 типа коллекций: ассоциативный массив, вложенная таблица и varray.Вы можете перенести данные из вложенной таблицы в тип данных varray.Затем вы можете следовать процедурам по этой ссылке: Выборка массива pl / sql возвращаемых значений в java

Прокомментируйте меня, если вы нашли прямое решение, чтобы я тоже мог его использовать.:)

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