У меня есть старое клиентское программное обеспечение с подключенной базой данных оракула для сохранения. В качестве интерфейса клиентское ПО допускает только вызов функций и процедур. У меня почти полный доступ к базе данных, т. е. я могу определять функции и процедуры. Из-за интерфейса только функции могут возвращать значения, и я не могу использовать параметр OUT
для процедур.
Теперь я просто хочу прочитать значение из таблицы:
SELECT value FROM myTable WHERE id = 42;
И затем увеличьте значение:
UPDATE myTable SET value = value + 1 WHERE id = 42;
Я мог бы использовать функцию для оператора select и процедуру для обновления и вызывать их последовательно. Проблема здесь в отсутствии транзакций на стороне клиента. Таким образом, между select и update другой поток может получить неправильные значения.
Итак, мой вопрос: как я могу использовать оба вызова в транзакции без использования транзакций...
Испробованные подходы:
- Используйте анонимные блоки PL/SQL -> синтаксис не поддерживается клиентом.
- Поместите оба вызова в одну функцию -> DML не разрешен в операторе выбора.
PRAGMA AUTONOMOUS_TRANSACTION
-> Я слышал, что это плохо, и его нельзя использовать.
Functions
предназначены для не побочных эффектов. Если вы хотите изменить состояние базы данных, вам нужно использовать файлProcedure
. - person MatBailie   schedule 18.12.2017counter
, и в этом сценарии больше ничего не происходит, вы можете рассмотретьCREATE SEQUENCE
? - person MatBailie   schedule 18.12.2017OUT
), мне нужны два вызова базы данных, которые не сохраняют потоки. - person Thanthla   schedule 18.12.2017SEQUENCE
(если у вас только один счетчик, а не таблица, полная счетчиков), или кто-то должен исправить архитектуру вашего программного обеспечения. Вы перечислили все вещи, которые вы не можете использовать (транзакции, процедуры и т. д.), и таким образом лишили базу данных возможности делать то, что вы хотите. Если вы не можете использовать то, что должны использовать, устраните проблему, мешающую вам использовать правильные инструменты. - person MatBailie   schedule 18.12.2017AFTER SELECT
. - person MatBailie   schedule 18.12.2017I have software that means I can't use any of the intended database constructs to atomically query and amend data. Is there some way that I can hack around and use the wrong database tools for the job, but it still be as robust as using the right tools?
Короче говоря, у вас есть проблема с архитектурой: либо программное обеспечение не соответствует вашим требованиям (замените его), либо оно не было настроено / использовано неправильно для этого варианта использования. - person MatBailie   schedule 18.12.2017SEQUENCE
? Ссылка на community.oracle, которую я предоставил, подразумевает, что она может работать по желанию. - person MatBailie   schedule 18.12.2017UPDATE
. OP хочет атомарно прочитать значение, а затем увеличить его без использования функций (потому что вы не можете выполнить ОБНОВЛЕНИЕ в функции), процедур (поскольку программное обеспечение OP не может считывать результаты ), анонимный блок PL/SQL (поскольку программное обеспечение OP не разрешает их) или транзакции (поскольку программное обеспечение OP не разрешает их)... - person MatBailie   schedule 18.12.2017