sql - 检查 SYS_REFCURSOR 是否为空的最佳方法

标签 sql oracle plsql sys-refcursor

我有一个带有选择值的游标,我想在取决于我是否找到任何行之后做一些事情。

recs_Table SYS_REFCURSOR;

begin

    open recs_Table for
       select * from table1, table2;


    if recs_Table%found then
        --do this
    else
        --do that
    end if;

end;

这似乎不起作用,有什么帮助吗?Ty

最佳答案

在使用 %FOUND 属性之前,您需要对游标执行 FETCH。将您的代码更改为类似

DECLARE
  recs_Table SYS_REFCURSOR;
  nTable_1_value  NUMBER;
  nTable_2_value  NUMBER;
begin

    open recs_Table for
       select * from table1, table2;


    FETCH recs_Table INTO nTable_1_value, nTable_2_value;

    if recs_Table%found then
        --do this
    else
        --do that
    end if;

end;

请注意,您可能需要向 FETCH 语句的 INTO 子句添加变量的方式,为 TABLE1 和 TABLE2 中的每一列添加一个变量。另请注意,此游标的写入方式可能会返回比预期更多的行;因为没有指定连接条件,您将获得所谓的笛卡尔连接,其中 TABLE1 中的每一行都连接到 TABLE2 中的每一行 - 因此,您将返回的行数是 (# of rows in TABLE1) * (TABLE2 中的行数)。

一种可能更简单的方法是使用游标 FOR 循环,如下所示:
DECLARE
  bData_found  BOOLEAN := FALSE;
begin
  FOR aRow IN (select * from table1, table2)
  LOOP
    -- If the program gets here, it means a row was fetched

    -- do this

    bData_found := TRUE;

    EXIT;  -- if you only care if data was found and don't want to 
           -- process all the rows
  END LOOP;

  IF NOT bData_found THEN
    -- do that
  END IF;
end;

分享和享受。

关于sql - 检查 SYS_REFCURSOR 是否为空的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18058245/

相关文章:

sql - Netezza 插入错误

sql - 如何从表 A 中引用表 B 行两次?

java - 如何知道一个 where 子句查询结果包含另一个 where 子句查询结果?

java - SQL Server 排序规则以匹配 Java 不区分大小写的 Unicode 比较

sql : How is data validation done through Stored procedures?

c# - 错误映射数据类型 Oracle 和 C#

java - 使用转换为 NULL 的转换器生成正确的 SQL?

mysql - 使用另一个表数据更新表行

oracle - systimestamp 和 sysdate 的奇怪行为

oracle - 错误地违反了 PL/SQL Pragma