一尘不染

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

sql

我有一个游标,带有来自选择的值,我想根据我是否发现任何行来做点什么。

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;

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


阅读 151

收藏
2021-03-08

共1个答案

一尘不染

您需要在使用%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中的每一行-
因此,您将获得的行数是(TABLE1中的行数)* (表2中的行数)。

一个可能更简单的方法是使用游标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;

分享并享受。

2021-03-08