我在 Oracle 11g RAC 环境中维护一些存储过程,这些过程是与其他系统进行数据交换的步骤管道的一部分。特别是其中之一一直在产生重复的记录。文件由 ETL 作业加载到一组暂存表中,然后调用这个没有参数的存储过程(除了被调用 ETL 代码忽略的 OUT 参数,但这是另一个问题)。该过程的主体以如下语句开头
For I in ( SELECT * from SOME_STAGING_TABLE where status = 'NEW' order by X_ID) LOOP
Run Code Online (Sandbox Code Playgroud)
但是,调用它的 ETL 作业又被另一个 ETL 作业调用,该作业查找所有尚未处理的“文件”并并行调用它,每个文件一次。我认为正在发生的事情是:
一种解决方案可能是在 ETL 服务中强制执行序列化。另一种可能是更改存储过程的调用约定,以便将文件 ID 作为参数。但是,假设我需要在数据库中执行此操作。有没有办法设置存储过程,以便一次只有一个连接可以执行其中的指定代码块?
(在 C 或 Java 中,这将被称为“互斥锁”或“同步块”,我知道 MySQL 有一个“LOCK TABLES”语句可用于该目的;Oracle 11g 有类似的功能吗?)