函数调用中的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

回到顶部