如何排队调用 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
并根据您的需要进行调整。
应注意 REQUEST
和 RELEASE
过程的 return 参数。
我在 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
并根据您的需要进行调整。
应注意 REQUEST
和 RELEASE
过程的 return 参数。