oracle 最好的方法来检查如果REFCURSOR是空的

7vhp5slm  于 2023-11-17  发布在  Oracle
关注(0)|答案(6)|浏览(151)

我有一个游标与值从一个选择,我想做的事情后,如果我有任何行找到或没有。

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;

字符串
这似乎不工作,任何帮助?泰

dl5txlt9

dl5txlt91#

在使用%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子句添加变量,TABLE 1和TABLE 2中的每一列都有一个变量。还请注意,编写此游标的方式可能会返回比预期更多的行;由于没有指定连接条件,您将得到所谓的笛卡尔连接,其中TABLE 1中的每一行都连接到TABLE 2中的每一行-因此,返回的行数是(表1中的行数)*(表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;


分享和享受。

ha5z0ras

ha5z0ras2#

我们使用两个过程来执行结果

create or replace procedure pro_sample(recs_Table out SYS_REFCURSOR) is

    begin
       open recs_Table for
           select * from table1, table2;
    end;

字符串
上述过程将用于打开游标

create or replace procedure pro_sample(recs_Table out SYS_REFCURSOR) is
   sam sys_refcursor;
   var number;
              -- if you have any variables then declare them
  begin
    pro_sample(sam);
    fetch sam into var;
    if sam%found then
       --do this
        else
       --do that
    end if;
    close sam;
 end;


上述过程将帮助您了解游标是否包含行

41ik7eoe

41ik7eoe3#

create or replace procedure pro_sample(recs_Table out SYS_REFCURSOR) is
    begin
       open recs_Table for
           select a,b,c,d from table1, table2;
    end;

create or replace function haveRows_pro_sample is
sam sys_refcursor;
var varchar(200);
varOut number:=0;
    begin
        pro_sample(sam);
        fetch sam into var,var,var,var;   
        if sam%found then
          varOut :=1;
        end if;
        return varOut;
    end;

字符串

eqoofvh9

eqoofvh94#

这是我的工作:D

IF(MYCURSOR%ROWCOUNT = 0)THEN
         DO SOMETHING ...
    ENDIF;

字符串

uemypmqf

uemypmqf5#

您也可以在打开游标之前执行select count()查询,然后按如下方式检查,以选择变量中的计数:

select count(*) into v_count from table1;
if v_count>0 then
    --do this
    open my_cursor for 
        select var1,var2,var3 from table1;
    fetch etc.
else
    --do that
end if;

字符串

7dl7o3gd

7dl7o3gd6#

--TO GET COUNT ON REF_SYSCURSOR BEFORE SENDING TO THE OUTPUT
 SET SERVEROUTPUT ON;
DECLARE
    recs_table SYS_REFCURSOR;
    curid           NUMBER;
BEGIN
    OPEN recs_table FOR SELECT
                            'ABC' name1,
                            'DEF' name2,
                            'GHI' name3
                        FROM
                            dual
                        WHERE 1=0;
curid := DBMS_SQL.TO_CURSOR_NUMBER (recs_table);
DBMS_OUTPUT.PUT_LINE('curid :'||curid);
LOOP
    IF DBMS_SQL.FETCH_ROWS(curid) > 0 THEN
        DBMS_OUTPUT.PUT_LINE('DATA FOUND IN CURSOR :'||curid);
    EXIT;
    ELSE
        DBMS_OUTPUT.PUT_LINE('DATA NOT FOUND IN CURSOR :'||curid);
    EXIT;
    END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(curid);
END;
/

字符串

相关问题