一尘不染

Oracle SQL:如何读取和增加字段

sql

我正在重构企业应用程序的数据导入过程,并遇到了一个片段,我想找到一个更好的解决方案。导入数据时,我们必须为每个数据集创建一个唯一的实体,并且在字段中存在一个计数器,该计数器用于顺序分配此ID。您阅读该字段以获取下一个空闲ID,然后将其递增以准备下一次。

目前,这是在原始应用程序中用“ C”编写的两个步骤:

   SELECT idnext FROM mytable;
   UPDATE mytable SET idnext = idnext + 1;

显然,如果多个进程执行相同的操作,则这里存在争用条件。

编辑:重要前提:我无法触摸数据库/字段定义,这排除了一个序列。

我们正在用perl重写,我想做同样的事情,但是更好。原子解决方案会很好。不幸的是,我的SQL技能有限,所以我转向集体智慧:-)


阅读 265

收藏
2021-03-17

共1个答案

一尘不染

在这种特定情况下,如前所述,序列是正确的解决方案。但是,如果将来在某些情况下需要更新某些内容并在同一条语句中返回值,则可以使用以下RETURNING子句:

UPDATE atable SET foo = do_something_with(foo) RETURNING foo INTO ?

如果调用代码是PL / SQL,则替换?。具有本地PL/SQL变量;否则,您可以将其绑定为程序中的输出参数。

编辑:自从您提到Perl以来,类似这样的事情应该起作用(未经测试):

my $sth = $dbh->prepare('UPDATE mytable SET idnext = idnext + 1 returning idnext into ?');
my $idnext;
$sth->bind_param_inout(1, \$idnext, 8);
$sth->execute; # now $idnext should contain the value

请参阅DBI

2021-03-17