欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oralce 游标

程序员文章站 2024-02-10 13:59:58
...
1,一般游标、参数游标。
   declare
deptrec department%rowtype;
dept_name department.name%type;
dept_id department.id%type;
cursor c1 is
select d.id,d.name from department d where id <= 1254;
--定义游标的参数必须是输入参数
cursor c2(c_dept_id department.id%type default 1262,c_dept_name department.name%type) is
select d.id,d.name from department d where d.id < c_dept_id and d.name = c_dept_name;
begin
open c1;
fetch c1 into dept_id,dept_name;
while c1%found loop
dbms_output.put_line(dept_id || '---' || dept_name);
fetch c1 into dept_id,dept_name;
end loop;
close c1;

dbms_output.put_line('*********************************');
--注意在打开游标的时候向游标传递参数,注意这里传递参数方式采用的“名称传值法”(可以不按照定义游标的参数的顺序传值)
--特别注意:游标的参数是用在游标对应的sql语句中,处理游标对应的sql别的任何地方访问不到这个传递的参数。
open c2(c_dept_name => 'chenchaoyang',c_dept_id => 562);
fetch c2 into dept_id,dept_name;
while c2%found loop
dbms_output.put_line(dept_id || '--' || dept_name);
fetch c2 into dept_id,dept_name;
end loop;
--dbms_output.put_line(c_dept_name);
close c2;
end;


3,可以把游标查询出来的行,作为rowtype来引用,下面是实例
declare
cursor cur(moneyName varchar2) is
select * from money m where m.name like moneyName;
cursor_rowtype cur%rowtype; --注意此种用法非常方便
begin
open cur('20元');--注意此处用的是oracle的位置传参法,也可以写成open cur(moneyName => '20元');
fetch cur into cursor_rowtype;
while cur%found loop
dbms_output.put_line(cursor_rowtype.miane);
fetch cur into cursor_rowtype;
end loop;
close cur;
end;


4,游标的for循环(比一般的游标操作方法要简单的多)
declare
cursor cur(moneyName varchar2) is
select * from money m where m.name like moneyName;
cursor_rowtype cur%rowtype;
begin
--隐含的打开游标
for each_record in cur(moneyName => '20元') loop
--隐含的取出游标的数据
dbms_output.put_line(each_record.miane || ',,,' || each_record.name);
end loop;
--隐含的关闭游标
end;


5,隐式游标
显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。
实例:删除EMPLOYEES表中某部门的所有员工,如果该部门中已没有员工,则在DEPARTMENT表中删除该部门
DECLARE 
V_deptno department_id%TYPE :=&p_deptno;
BEGIN
DELETE FROM employees WHERE department_id=v_deptno;
IF SQL%NOTFOUND THEN
DELETE FROM departments WHERE department_id=v_deptno;
END IF;
END;
相关标签: 游标