本书上讲这是用于管理游标的内存的数量。
DECLARE
CURSOR C_NAME
IS
SELECT ENAME FROM EMP
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT
WHERE CITY_ID=‘BJ’)
--- 说明游标可以用子查询
四、打开游标
OPEN CURSOR_NAME;
这时游标将它的指针指向活动集的开始,指针指向第一条记录的前面是因为它还没有执行FETCH命令。如果试图打
开一个已经打开的游标,将出错:
ORA-06511:PL/SQL:CURSOR ALREADY OPEN
我们可以这样:
IF NOT C_NAME%ISOPEN
THEN
OPEN C_NAME;
END IF;
五、从游标中取回数据
FETCH CURSOR_NAME INTO RECOR-LIST;
关闭游标:CLOSE CURSOR_NAME
六、实例:
DECLARE
myname varchar2(22);
CURSOR C_NAME
IS
SELECT ENAME FROM EMP;
begin
IF NOT C_NAME%ISOPEN
THEN
OPEN C_NAME;
end if;
LOOP
FETCH c_name into myname;
dbms_output.put_line (myname);
exit when c_name%notfound;
end loop;
close c_name;
end;
/--我们将对以上程序进行变形,形成复杂的光标利用。
DECLARE
myname varchar2(22);
thisdeptno scott.emp.deptno%type;
CURSOR C_NAME
IS
SELECT ENAME,deptno FROM EMP order by deptno desc;
begin
IF NOT C_NAME%ISOPEN
THEN
OPEN C_NAME;
end if;
LOOP
FETCH c_name into myname,thisdeptno;
dbms_output.put_line (myname||','||thisdeptno || ',' || to_char(c_name%rowcount));
exit when c_name%notfound;
end loop;
dbms_output.put_line ('the Total record is fetched is ' || to_char(c_name%rowcount));
close c_name;
end;
/
我们增加变量,进行用了排序,使用了光标属性,大家看结果发生的变化,想想为什么。
实例精华!!!: DECLARE
myname varchar2(22);
ii number;
thisdeptno scott.emp.deptno%type;
CURSOR C_NAME
IS
SELECT * FROM EMP order by deptno desc;
emp_record c_name%rowtype;
begin
ii:=1;
for emp_record in c_name loop
dbms_output.put_line(ii);
ii:=ii+1;
end loop;
end;
/
--这里使用了游标FOR循环,在FOR循环的开始,进行、和END LOOP,分别隐式进行了游标的打开、FETCH和CLOSE
。
我们甚至可以不声明游标:FOR emp_record in (SELECT * FROM DEPT) loop
这种技术被称为显式游标的自动化。
在上面,我们可以将一个表的所有字段输出,如我们将PUT_LINE的II改为emp_record.ename,就可以输出一个字段
内容。
这种方式非常简单而且效率较高。
----------------
为了测试光标属性的重要性,我们做一个以下的过程:
create or replace PROCEDURE change_salary
(v_emp_id IN NUMBER, -- formal parameters
v_new_salary IN NUMBER)
IS
BEGIN -- begin PL/SQL block
UPDATE emp
SET sal = v_new_salary
WHERE empno = v_emp_id;
COMMIT;
END change_salary;
/
这样,我们在匿名块中,
UPDATE DEPT
SET DNAME='MY DEPT' WHERE ....;
IF SQL%FOUND THEN
COMMIT;
ELSE
change_salary(7369,9000);
END IF;
我们看到我们通过流程控制了不同的执行结果,对于过程,我们可以用以下几种方法调用:
在SQLPLUS中:CALL change_salary(7369,9000);
EXECUTE change_salary(7369,9000);
在一个块中,如:
begin
change_salary(7369,9000);
end;
/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34329/viewspace-916788/ ,如需转载,请注明出处,否则将追究法律责任。