游标的三种定义方式

/********************/
--游标的几种定义方式
--隐式游标
--显示游标
--游标变量
/********************/

--隐式游标1
--这个例子演示了游标属性的用法
--游标属性:%FOUND,%NOTFOUND,%ISOPEN,%ROWCOUNT
--注意COMMIT的位置,如果commit在游标属性之前,游标属性失效
DECLARE
BEGIN
UPDATE emp SET emp.deptno=20 WHERE emp.deptno='20';
--COMMIT;
IF sql%NOTFOUND THEN dbms_output.put_line('没有任何记录');
ELSE dbms_output.put_line(sql%ROWCOUNT);
END IF;
COMMIT;
END;

--隐式游标2

--游标for循环,因为没有显示的定义游标,所以没有open,没有close,也没有fetch into
DECLARE
dep emp.deptno%type;
BEGIN
FOR cur IN (SELECT emp.deptno FROM emp)
LOOP
dbms_output.put_line(cur.deptno);
END LOOP;
--以下写法错误,因为没有显式定义游标,所以fetch into不能使用
/*FOR cur2 IN (SELECT emp.deptno FROM emp)
LOOP
FETCH cur2 INTO dep;
EXIT WHEN cur2%NOTFOUND;
dbms_output.put_line(dep);
END LOOP;*/
END;

--显式游标
DECLARE
CURSOR cur IS SELECT deptno t1,ename t2 FROM emp;
dep emp.deptno%type;
ena emp.ename%type;
BEGIN
--打开游标
OPEN cur;
LOOP
FETCH cur INTO dep,ena;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(dep);
dbms_output.put_line(ena);
END LOOP;
dbms_output.put_line('影响'||cur%ROWCOUNT);
--关闭游标
CLOSE cur;
--dbms_output.put_line('影响'||cur%ROWCOUNT);放在这里会错误,因为游标已经关闭
--游标for循环,不需要打开和关闭
FOR r IN cur
LOOP
dbms_output.put_line(r.t1);
dbms_output.put_line(r.t2);
END LOOP;
END;

 

 

--游标变量
DECLARE
TYPE curtype IS REF CURSOR;
cur curtype;
dep emp.deptno%type;
ena emp.ename%type;

--顺带演示一下自定义类型

TYPE emptype IS RECORD(
dep emp.deptno%TYPE,
ena emp.ename%TYPE
);
empt emptype;
BEGIN

OPEN cur FOR SELECT deptno t1,ename t2 FROM emp;
LOOP
FETCH cur INTO dep,ena;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(dep);
dbms_output.put_line(ena);
END LOOP;
dbms_output.put_line('影响'||cur%ROWCOUNT);
CLOSE cur;

--与上例的区别在于,fetch into 到一个自定义类型的变量

OPEN cur FOR SELECT deptno t1,ename t2 FROM emp;
LOOP
FETCH cur INTO empt;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(empt.dep);
dbms_output.put_line(empt.ena);
END LOOP;
dbms_output.put_line('影响'||cur%ROWCOUNT);
CLOSE cur;

END;

 

总结一下,在查询的时候,隐式游标使用游标for循环,显式游标可可以使用游标for循环也可以open、close,游标变量使用open for,游标变量不和特定的查询结合在一起,例如:open cur for select t.emptno from emp t loop .....end loop; close cur;之后还可以直接写 open cur for select t.ename from emp t loop.....end loop; close cur;。在显式游标和游标变量的情况下,可以用游标名+游标属性的方式来使用游标属性,例如cur%isopen;

你可能感兴趣的:(游标)