Oracle 过程:从 Table A 读取,如果未找到,则转到 Table B

Oracle Procedure: Read from Table A and if not found go to Table B

我想从 Table-A 或 Table-B 读取数据。我的数据库是 oracle,过程必须使用最少数量的查询。要求是从一个 table 读取数据,如果数据不可用,则转到另一个 table。我写了以下程序,

CREATE OR REPLACE PROCEDURE READ(myId IN VARCHAR2, aout OUT   SYS_REFCURSOR,  bout OUT SYS_REFCURSOR )
  IS
  temp_acout_type A_TABLE%ROWTYPE;
  BEGIN
     OPEN aout FOR SELECT * FROM A_TABLE WHERE ID = myId;
     FETCH aout into temp_acout_type ;
     if aout%NOTFOUND then
        OPEN bout FOR SELECT * FROM B_TABLE WHERE ID = myId;
     end if;
 END;

我从 java 端调用这个函数。我的问题是一旦我在过程中获取游标,游标就会丢失数据。我从 Java 客户端观察到这一点,因为 ResultSet 在 java 端是空的(过程中的查询将只有 1 条记录,因为它是从主键搜索的),尽管它必须包含数据。

我需要一种方法来实现上述逻辑,但又不使用更多查询(例如:Table-A 提供了第一个检查数据)。有办法做到这一点吗?

检查 table 中的行数。您可以在 12c 中使用 行限制 子句,例如 ROWNUMFETCH

既然你说 ID 是主键,因此它只会获取 1 行,那么只需这样做:

SELECT COUNT(*) INTO var_cnt FROM A_TABLE WHERE ID = myId;

IF var_cnt > 0
THEN 
   OPEN aout FOR SELECT * FROM A_TABLE WHERE ID = myId;
ELSE
   OPEN bout FOR SELECT * FROM B_TABLE WHERE ID = myId;
END IF;

但是,您无法确定正在获取的行是否肯定会出现在游标结果集中,因为同时其他一些会话可能 DELETE [=] 之前的行21=]OPEN FOR 语句正在执行。

为了理智,我建议在 显式游标 查询中使用 Analytic COUNT() OVER()

您始终可以在 PL/SQL 存储过程中打开两个游标,然后在 Java 中,从第一个游标中获取数据,如果您不这样做,则只从第二个游标中获取数据从第一个获取数据。这将防止发生不必要的读取(打开游标不会进行任何读取;它会设置执行路径,以便在您想要获取数据时使用)。

或者,您可以在两个表之间进行联合,并且只在第一行 select 中进行联合(其中 first 表示第一个查询中有数据)。