我有一个带有选择值的光标,我希望在取决于我是否找到任何行之后做一些事情。
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
答案 0 :(得分:4)
在使用%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中的行数)* (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;
分享并享受。
答案 1 :(得分:0)
我们使用两个程序来执行结果
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;
上述过程将帮助您了解光标是否包含行
答案 2 :(得分:0)
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;
答案 3 :(得分:0)
这项工作对我来说:D
IF(MYCURSOR%ROWCOUNT = 0)THEN
DO SOMETHING ...
ENDIF;
答案 4 :(得分:0)
您还可以通过在打开游标之前执行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;