我有一个以下存储过程,其中我使用了游标。根据游标是否返回任何记录,我需要进行一些处理。
但我不知道如何检查游标是否返回任何记录。
CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
IN_USER_ID IN NUMBER,
IN_EMPLOYEE_ID NUMBER,
IN_HC_AS_ON_DATE VARCHAR2,
emp_cursor OUT SYS_REFCURSOR
)
IS
CURSOR employees IS
SELECT * FROM EMPLOYEE e;
BEGIN
if(record exist ) then
FOR employee IN employees
LOOP
// do something
END LOOP;
else if employees is empty then
// do something else
END;
答案 0 :(得分:13)
无法打开光标,无法检查光标是否返回记录
(见here)
所以你可以有一些快速查询只是为了查看是否有记录(例如使用count),
或者,您可以这样做:
CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
IN_USER_ID IN NUMBER,
IN_EMPLOYEE_ID NUMBER,
IN_HC_AS_ON_DATE VARCHAR2,
emp_cursor OUT SYS_REFCURSOR
)
IS
is_found_rec boolean := false;
CURSOR employees IS
SELECT * FROM EMPLOYEE e;
BEGIN
FOR employee IN employees
LOOP
is_found_rec := true;
// do something
END LOOP;
if not is_found_rec then
// do something else
end if;
END;
答案 1 :(得分:11)
我认为只有FETCH
才有可能。尝试使用
if myCursor%found then
// some body
end if;
但是,如果有人知道另一种方式,那么纠正我。
答案 2 :(得分:1)
我喜欢这样:
DECLARE
CURSOR my_cur
IS
SELECT 'a' AS a FROM DUAL WHERE 1=1;
my_rec my_cur%rowtype;
BEGIN
OPEN my_cur;
LOOP
FETCH my_cur INTO my_rec;
IF my_cur%NOTFOUND
THEN
IF my_cur%ROWCOUNT=0
THEN
-- do stuff when cursor empty
DBMS_OUTPUT.PUT_LINE('NOTFOUND,RC=0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
END IF;
EXIT;
ELSE
-- do stuff when cursor not empty
DBMS_OUTPUT.PUT_LINE('FOUND,RC>0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
END IF;
END LOOP;
CLOSE MY_CUR;
END;
当光标为1 = 1(非空)时输出:
FOUND,RC>0_1_a
当光标为1 = 0(空)时输出:
NOTFOUND,RC=0_0_
答案 3 :(得分:0)
我喜欢使用包含游标的相同选择查询,然后选择返回到变量中的计数。然后,您可以评估该变量以确定下一步要做什么。例如,您有一个这样的光标:
CURSOR c_example IS
SELECT field1
,field2
,field3
FROM table1 a
WHERE a.field1 LIKE '%something%';
在打开游标进行任何处理之前,请将游标结果计数选择为变量。
SELECT count(*)
INTO v_exampleCount
FROM table1 a
WHERE a.field1 LIKE '%something%';
现在,再次打开游标之前,请执行以下操作:
IF exampleCount>0 THEN
FOR example IN c_example
LOOP
....
END LOOP; --end example loop
....
END IF; --end example if
答案 4 :(得分:0)
341/5000 一种解决方案是使用反向逻辑。例如不可能问:
IF my_record IS NULL THEN
do something;
END IF;
或
IF my_record.my_attibute IS NULL THEN
do something;
END IF;
相反,可以问:
IF my_record.my_attibute IS NOT NULL THEN
go on processing;
ELSE
do something;
END IF;