oralce 游标

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;

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