Могу ли я обновить результат (sys_refcursor) хранимой процедуры Oracle (в Java)? - PullRequest
2 голосов
/ 07 октября 2009

С учетом следующей функции:

create or replace FUNCTION "GETADDRESSES"
    RETURN sys_refcursor
IS
    address_cursor sys_refcursor;
BEGIN
    OPEN address_cursor FOR 
        SELECT * FROM Address;
    RETURN address_cursor;
END;

Я хотел бы иметь возможность вносить изменения в этот набор результатов в Java и публиковать изменения в базе данных. Он вызывается в Java следующим образом:

        String genericQuery = "{ call ? := getAddresses() }";
        CallableStatement stmt = connection.prepareCall(genericQuery, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

       stmt.registerOutParameter(1, OracleTypes.CURSOR);
       stmt.execute();
       ResultSet rs = (ResultSet)stmt.getObject(1);
       while (rs.next())
       {
           System.out.println (rs.getString(2)); 
           rs.updateString(2, "*" + rs.getString(2));
       }
       stmt.close();

, что вызывает исключение "Недопустимая операция для набора результатов только для чтения". Есть ли способ вернуть этот курсор как нечто, что можно обновить и отправить обратно в БД из Java? Я использую Oracle 10g.

Спасибо, Роб

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

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

1 голос
/ 07 октября 2009

Проблема в том, что когда вы указываете CONCUR_UPDATABLE, это относится к ResultSet самого вызова функции - если он был, а его нет. Объект ResultSet, который вы получаете через getObject (), не является ResultSet объекта CallableStatement, поэтому по умолчанию он не обновляется.

Моей первой мыслью было, что добавление FOR UPDATE к запросу в функции может сделать ResultSet обновляемым, но не повезло.

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

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