函数调用中的DML
我有一个旧的客户端软件,它有一个连接的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
- >我听说这是一件坏事,不应该使用。
回答:
您可以做DML,如下面所示的函数里面,但我要强调 - 采取的其他意见留意。看看使用一个序列(甚至是多个序列),因为在函数内部做DML通常是一个坏主意,因为函数调用的执行次数(如果从SQL调用的话)不是确定性的。另外,如果大量使用,还有可扩展性问题。并且在多用户环境中,您需要处理锁定/序列化,否则您将需要多个会话才能返回相同的整数值。
所以......在这一切之后,你仍然想头这条道路:-(
SQL> create table t (x int); Table created.
SQL> insert into t values (0);
1 row created.
SQL>
SQL> create or replace
2 function f return int is
3 pragma autonomous_transaction;
4 retval int;
5 begin
6 update t
7 set x = x + 1
8 returning x into retval;
9 commit;
10 return retval;
11 end;
12/
Function created.
SQL>
SQL> select f from dual;
F
----------
1
1 row selected.
SQL> select * from t;
X
----------
1
1 row selected.
SQL> select f from dual;
F
----------
2
1 row selected.
SQL> select * from t;
X
----------
2
1 row selected.
SQL> select f from dual;
F
----------
3
1 row selected.
SQL> select * from t;
X
----------
3
1 row selected.
以上是 函数调用中的DML 的全部内容, 来源链接: utcz.com/qa/262432.html