如何排队调用 Oracle 中的存储过程?

How to queue up calls to stored procedures in Oracle?

我在 oracle 中有一个存储过程(如果相关的话,它将一次性作业安排到 运行 另一个过程)。该作业调用另一个 运行s 几分钟的存储过程,并执行插入更新和删除操作,还使用循环。现在,虽然长过程是 运行ning,但如果有另一个调用 运行,是否可以阻止它们同时执行?更好的是,让第二个在前一个完成后执行,比如将它们排队?

为了防止两个存储过程同时 运行,您可以使用 DBMS_LOCK 来获得独占锁(或者只是尝试更新给定 [=13= 中的同一行) ]).

为了您的目的,我们设计了程序 DBMS_LOCK.ALLOCATE_UNIQUE

分配一些唯一的 lockname 字符串并在您的过程中的关键序列的开头调用该过程。您将得到 lockhandle 作为输出。

然后调用DBMS_LOCK.REQUEST开始唯一处理

DBMS_LOCK.ALLOCATE_UNIQUE( v_lockname, v_lockhandle);    
v_res := DBMS_LOCK.REQUEST( lockhandle=>v_lockhandle, release_on_commit => TRUE);

最后你必须释放句柄才能处理下一个运行

v_res :=  DBMS_LOCK.RELEASE (v_lockhandle);

一个好的做法是在异常部分也释放它,以便在失败后不被阻止。

请检查文档中可能的选项,例如 release_on_commit 并根据您的需要进行调整。

应注意 REQUESTRELEASE 过程的 return 参数。