ORACLE游标(cursor)的使用

--声明游标;

--CURSOR cursor_name IS statement

--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
DECLARE       
       CURSOR c_job  --声明游标名称
       IS
                     --游标所要完成的事项
       SELECT e.study_no, e.student_name
       FROM export e
       WHERE e.student_name='yanzhu';
                     --定义一个游标变量c_row c_job%ROWTYPE ,该类型为游标c_job中的一行的数据类型
       c_row c_job%ROWTYPE;
BEGIN
       FOR c_row IN c_job LOOP
       	             --循环输出符合条件的两列内容
         dbms_output.put_line(c_row.study_no||'-'||c_row.student_name);
       END LOOP;
END;

--Fetch游标

--使用的时候必须要明确的打开和关闭

DECLARE
       CURSOR c_job  --声明游标名称
       IS
                     --游标所要完成的事项
       SELECT e.study_no, e.student_name
       FROM export e
       WHERE e.student_name='yanzhu';
                     --定义一个游标变量c_row c_job%ROWTYPE ,该类型为游标c_job中的一行的数据类型
       c_row c_job%ROWTYPE;
begin
       open c_job;
       --打开游标
         loop
           --提取一行数据到c_row
           fetch c_job into c_row;
           --判读是否提取到值,没取到值就退出
           --取到值c_job%notfound 是false 
           --取不到值c_job%notfound 是true
           exit when c_job%notfound;
             dbms_output.put_line(c_row.study_no||'-'||c_row.student_name);
         end loop;
       --关闭游标
      close c_job;
end;

--执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况

DECLARE
       CURSOR c_job  --声明游标名称
       IS
                     --游标所要完成的事项
       SELECT e.study_no, e.student_name
       FROM export e
       WHERE e.student_name='yangguizhu';
                     --定义一个游标变量c_row c_job%ROWTYPE ,该类型为游标c_job中的一行的数据类型
       c_row c_job%ROWTYPE;
       BEGIN
       	 UPDATE export SET student_name='ALEARK' WHERE study_no=1;
         IF sql%ISOPEN THEN 
           dbms_output.put_line('Openging');
           ELSE 
             dbms_output.put_line('closing');
             END IF;
          IF sql%FOUND THEN
            dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
            ELSE 
              dbms_output.put_line('Sorry');
              END IF;
              IF sql%NOTFOUND THEN
                dbms_output.put_line('Also Sorry');
                ELSE 
                  dbms_output.put_line('Haha');
                  END  IF ;
                   dbms_output.put_line(sql%ROWCOUNT);
                   EXCEPTION  
                     WHEN no_data_found THEN
                       dbms_output.put_line('Sorry No data');
                       WHEN too_many_rows THEN
                         dbms_output.put_line('Too Many rows');
       END;

--cursor   for循环

DECLARE 
       CURSOR csr_dept
       IS 
       --select语句
       SELECT e.student_name
       FROM export e;
       --指定行指针,类型指定为和csr_dept行类型相同的变量
       row_dept csr_dept%ROWTYPE;
BEGIN
       --for循环
       FOR row_dept IN csr_dept LOOP
           dbms_output.put_line('姓名:'||row_dept.student_name);
       END LOOP;
END;

--cursor while循环
DECLARE 
	--声明游标
	CURSOR select_name
	IS SELECT * FROM export e;
	--声明指针
	row_found export%ROWTYPE;
	BEGIN
		OPEN select_name;
		--提取游标第一行数据装入指针
		FETCH select_name INTO row_found;
		WHILE select_name%FOUND 
		LOOP
			dbms_output.put_line('名称:'||row_found.student_name);
			--循环提取游标行装入指针
			FETCH select_name INTO row_found;
		END LOOP;
		CLOSE select_name;
	END;

--带参数cursor

declare 
      CURSOR 
      c_dept(p_deptNo number)
      is
      select * from export emp where emp.study_no=p_deptNo;
      r_emp export%rowtype;
begin
        for r_emp in c_dept(1) loop
            dbms_output.put_line('姓名:'||r_emp.student_name||'   序号:'||r_emp.study_no);
        end loop;
end;

--按照条件对学生序号进行递增

declare
        cursor
        csr_Update
        is
        select * from  export t for update OF t.study_no;
        empInfo csr_Update%rowtype;
        saleInfo export.study_no%TYPE;
begin
    FOR empInfo IN csr_Update LOOP
      IF empInfo.study_no<30 THEN
        saleInfo:=empInfo.study_no*1.2;
      ELSIF empInfo.study_no<50 THEN
        saleInfo:=empInfo.study_no*1.5;
      ELSIF empInfo.study_no<70 THEN
        saleInfo:=empInfo.study_no*2;
      END IF;
      UPDATE export SET study_no=saleInfo WHERE CURRENT OF csr_Update;
     END LOOP;
END;

--游标中case when的使用

必须注意:结束时的else必须带否则报错。

declare
     cursor
         insert_numbers
          is
          SELECT * FROM export e WHERE ROWID IN 
          (SELECT max(ROWID) FROM export t1 WHERE e.study_no=t1.study_no) ORDER BY e.study_no;
          r_row_in insert_numbers%ROWTYPE;
	        mynum export.student_name%TYPE;
	        numid export.study_no%TYPE:=1;
     begin
        FOR r_row_in IN insert_numbers LOOP
        	numid:=numid+1;
         CASE 
          WHEN r_row_in.student_name='zhangshijie'  THEN numid:=r_row_in.study_no;mynum:=r_row_in.student_name;
          WHEN r_row_in.student_name='huipengxian'  THEN numid:=r_row_in.study_no;mynum:=r_row_in.student_name;
          WHEN r_row_in.student_name='myName'  THEN numid:=r_row_in.study_no; mynum:=r_row_in.student_name;          
          WHEN r_row_in.student_name='chenyantao'  THEN numid:=r_row_in.study_no;mynum:=r_row_in.student_name;
          ELSE
            	numid:=numid+1;
            	mynum:='crs';
         end case;
          INSERT INTO numbers(numberid,mynumber) VALUES (numid,mynum);
        end loop;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值