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 中使用 行限制 子句,例如 ROWNUM
或 FETCH
。
既然你说 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 表示第一个查询中有数据)。
我想从 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 中使用 行限制 子句,例如 ROWNUM
或 FETCH
。
既然你说 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 表示第一个查询中有数据)。