我有一个旧的客户端软件,它有一个连接的oracle数据库用于持久化。作为接口,客户端软件只允许调用函数和过程。我几乎可以完全访问数据库,即我可以定义函数和过程。由于接口,只有函数可以返回值,我不能使用过程的参数选项OUT
。函数调用中的DML
现在我只是想读从表中的值:
SELECT value FROM myTable WHERE id = 42;
,又重新增加值:
UPDATE myTable SET value = value + 1 WHERE id = 42;
我可以用一个函数的SELECT语句,并为一个程序更新并连续呼叫。这里的问题是客户端不存在交易。因此,在select和update之间另一个线程可能会得到错误的值。
所以我的问题是,我该如何使用在交易双方通话,而无需使用交易...
尝试的途径:
- 使用匿名PL/SQL块 - >语法不受客户支持。
- 将两个调用放在一个函数中 - >在select语句中不允许DML。
PRAGMA AUTONOMOUS_TRANSACTION
- >我听说这是一件坏事,不应该使用。
'Functions'旨在*** ***不是有副作用。如果你想要改变数据库的状态,那么你需要使用'Procedure'。 – MatBailie
如果你想要一个简单的'计数器',并且在这种情况下没有其他事情发生,你可以考虑'CREATE SEQUENCE'? – MatBailie
如果我使用过程(并且不能使用'OUT'),我需要两个不是线程保存的数据库调用 – Thanthla