• oracle 游标分析与理解(基础)


    --------------坚持写一点 慢慢成长 希望对大家有所帮助(小白的理解)  也是自己学习后的理解(只是一小部分,需要更深沉的还需日后成长)

    接下来就是我们的重点

    --游标

    提供了一种对从表中检索出的数据进行操作的灵活手段,

    从表中检索出结果集,从中每次指向一条记录进行交互的机制.

    能对多条数据 每一条数据进行判断

    --游标的作用

    1.指定结果集中特定行的位置.

    2.基于当前的结果集位置检索一行或者连续的几行.

    3.结果集的当前位置修改行中的数据.

    4.对其他用户所做的数据更爱定义不懂的敏感性级别.

    5.可以以编程的方式访问数据库

    可以看到结果集都标注了红色,大致意思就是把查询好的一个结果集当做一个表 然后我们在对这个结果集来进行一些操作.

    --游标的状态

    %Found:Fetch语句(获取记录)执行情况,返回Boolean类型

    %NotFound:最后一条记录是否提取出,返回Boolean类型

    %ISOpen:游标是否打开,返回Boolean类型

    %RowCount:游标当前提取的行数.

    --游标的创建

    Declare
         Cursor myCur is select empno,ename,sal from emp;
         vna varchar2(10);
         vno number(4);
         vsal number(7,2)  ;
      Begin
         open myCur;--打开游标
         fetch myCur into vno,vna,vsal;--fetch 游标名 into 属性变量
         dbms_output.put_line(vno||'    '||vna||'    '||vsal);--打印
         close myCur;--关闭游标
      End;

    --可以看到上面的方法非常的繁琐 如果像这样每次都要打开游标然后吧东西存到变量里面再打印出来最后关闭游标 岂不是很麻烦 所以 有一种方法能够省去一些步骤也能实现同样的功能

    那就是下面说的这种方法  便利循环游标  就是用for循环写的 省去了一些代码

    循环游标隐式打开游标,自动滚动获取一条记录,并自动创建临时记录类型变量存储记录,处理完后自动关闭游标.

    for 变量名 in 游标名

    loop

    数据处理sql语句;

    end loop;

    --再介绍一下刚说的功能(对多条数据每一条数据进行判断) 如果用存储过程写的话要写好几条语句用游标只需要一条 即

    --创建一个游标
    --把c语言成绩大于等于90分的+5分
    --大于等于八十小于就是的+10分
    --小于80分的+20分
    对多条数据 每一条数据进行判断
    DECLARE
    CURSOR cur IS SELECT c.*
    FROM chenji c,kechen k
    WHERE c.kno=k.kno AND k.kname='C';
    BEGIN
    FOR cun IN cur--把游标直接赋予cun变量了(省去上面的一个步骤)
    LOOP
    IF cun.score>=90 THEN--分支
    cun.score:=cun.score+5; 
    ELSIF cun.score>=80 THEN--分支
    cun.score:=cun.score+10;
    ELSIF cun.score<80 THEN--分支
    cun.score:=cun.score+20;
    END IF;--结束分支
    UPDATE chenji SET score=cun.score WHERE kno=cun.kno AND stuno=cun.stuno;
    COMMIT; --修改后的提交方法
    END LOOP; --结束循环
    END;

    loop的写法容易写错不建议使用 这就没分享  for循环比较熟悉一些不容易写错 公认比较好的

    --如果说我们要一直使用这个游标那么就要每次选中然后执行这样是不是太麻烦了呢?

    --那么就有一种办法解决这一麻烦的操作 上一次说的存储过程相当于一个方法 这一块就可以把游标和存储过程写在一起想要使用的时候直接调用就行了

    CREATE OR REPLACE PROCEDURE p1
    AS
    CURSOR cur IS
    SELECT cj.stuno,cj.kno,cj.score
    FROM kecheng k,chengji cj
    WHERE k.kno=cj.kno AND
    k.kname='C';
    BEGIN
    FOR ccc IN cur -- 循环取出每一条数据
    LOOP
    --dbms_output.put_line(ccc.stuno||'-'||ccc.kno||'-'||ccc.score);
    IF ccc.score>=90 THEN -- 判断条件 3条分支
    ccc.score:=ccc.score+5;
    ELSIF ccc.score>=80 AND ccc.score<90 THEN
    ccc.score:=ccc.score+10;
    ELSIF ccc.score<80 THEN
    ccc.score:=ccc.score+20;
    END IF;
    --- 成绩已经计算出来,开始修改数据库表
    UPDATE chengji SET score=ccc.score
    WHERE stuno=ccc.stuno AND
    kno=ccc.kno;
    END LOOP;
    END;
    SELECT * FROM chengji;--中间查询用的
    -- 调用
    DECLARE
    BEGIN
    p1();--调用
    END;

    好了  自己的见解就这些希望给需要的朋友一些帮助   自己也是个小白 还是那句话慢慢成长

    在这也推荐一个大佬  我有一些不知道怎么解释的就借鉴他的@不经意的回眸https://www.cnblogs.com/miciing/articles/2783026.html

    好东西就要拿出来分享 拜拜!

                                                  时间2019-3-2 凌晨0:17分  

                                                        HaoDi888

  • 相关阅读:
    HDU 4772 Zhuge Liang's Password (矩阵旋转)
    POJ 1141 Brackets Sequence(区间DP)
    POJ 2531 Network Saboteur (DFS)
    HDU 2680 Choose the best route (最短路)
    HDU 1285 确定比赛名次 (预处理+拓扑排序)
    HDU 4540 威威猫系列故事——打地鼠 (DP)
    HDU 2899 Strange fuction (二分)
    HDU 3485 Count 101(DP)
    codeforces 510c (拓扑排序)
    codeforces 510B Fox And Two Dots(dfs)
  • 原文地址:https://www.cnblogs.com/lqh-haodi/p/haodi.html
Copyright © 2020-2023  润新知