我有一个游标,带有来自选择的值,我想根据我是否发现任何行来做点什么。
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;
这似乎不起作用,有帮助吗?
您需要在使用%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;
分享并享受。