• Oracle游标总结


    1.声明游标

    declare
    teacher_id number(5);
    teacher_name varchar2(5);
    teacher_title varchar2(50);
    teacher_sex char(1);
    
    cursor teacher_cur is
        select tid,tiname,title,sex from teachers where tid<117;

    2.打开游标

    open 游标名;

    declare
    teacher_id number(5);
    teacher_name varchar2(5);
    teacher_title varchar2(50);
    teacher_sex char(1);
    
    cursor teacher_cur is
        select tid,tiname,title,sex from teachers where tid<117;
    open teacher_cur;

    3.提取游标

    fetch 游标名 into 变量列表

    declare
    teacher_id number(5);
    teacher_name varchar2(5);
    teacher_title varchar2(50);
    teacher_sex char(1);
    
    cursor teacher_cur is
        select tid,tiname,title,sex from teachers where tid<117;
    open teacher_cur;
    fetch teacher_cur into tid,tinme,title,sex;

    4.关闭游标

    close 游标名

    declare
        teacher_id number(5);
        teacher_name varchar2(5);
        teacher_title varchar2(50);
        teacher_sex char(1);
    
    cursor teacher_cur is
        select tid,tiname,title,sex from teachers where tid<117;
    open teacher_cur;
        fetch teacher_cur into tid,tinme,title,sex;
        Loop 
            EXIT WHEN NOT teacher_cur%FUND;
            IF teaher_sex = 'M' THEN
                INSERT INTO MALE_TEACHERS(TID,TNAME,TITLE) VALUES();    
            ELSE 
                INSERT INTO FEMALE_TEACHERS(TID,TNAME,TITLE) VALUES(teacher_id,teacher_name,teacher_title);
            END IF;
        FETCH teacher_cur INTO teacher_id,teacher_name,teacher_title,teacher_sex;
        END LOOP;
    CLOSE teacher_cur;
    END;

    使用显示游标:

    1):使用前用游标名%ISOPEN检查打开状态,只有值为TRUE是才可使用

    2):使用游标每次都要用%NOTFUND,%FUND确认是否返回成功

    3):提取游标时对应变量个数一致

    4):必须关闭游标释放资源


    1.%fund是否找到有效行,是则为true 否则是false

    open teacher_cur;
    fetch teacher_cur into teacher_id,teacher_name,teacher_title,teacher sex;
    loop 
    exit when not teacher_cur%found;
    end loop

      SQL%fund

    delete from teachers
        where tid=teacher_id;
    if SQL%found then
        insert into success values(tid);
    else
        insert into fail values(tid);
    end if;

    2.%NOTFOUND

    OPEN teacher_cur;
    FETCH teacher_cur INTO teacher_id,teacher_name,teacher_title,teacher_sex;
    LOOP
        EXIT WHEN teacher_cur%NOTFOUND;
    END LOOP

      SQL%NOTFOUND

    DELETE FROM TEACHERS
        WHERE TID = teacher_id;
    IF SQL%NOTFOUND THEN
        INSERT INTO FALL VALUES(TID);
    ELSE
        INSERT INTO SUCCESS VALUES(TID);
    END IF;

    3.%ROWCOUNT

    该属性记录了游标抽取过的记录行数,也可以理解为当前游标所在的行号,这个属性在循环判断中有效

    LOOP
        FETCH teacher_our INTO teacher_id,teacher_name,teacher_title,teacher_sex;
        EXIT WHEN teacher_cur%ROWCOUNT=10;--只抽取10条记录
        ...
        END LOOP;

    用FOR语句控制游标的循环,系统隐含的定义了一个数据类型为%ROWCOUNT的记录,作为循环计数器,并将隐士的打开和关闭游标

    FOR teacher_record in teacher_cur LOOP --teacher_record作为记录名,隐含的代开游标teacher_cur
        INSERT INTO TEMP TEACHERS(TID,TNAME,TITLE,SEX) VALUES(teacher_record,tid,teacher_record,tname,teacher_record,title,teacher_record.sex);
    END LOOP

    4.%ISOPEN

    ... ...

    5.参数话游标:

    DECLARE
    --定义游标是带上参数CURSOR_ID
        CURSOR teacher_cur(CURSOR_id NUMBER) IS
            SELECT TNAME,TITLE,SEX FROM TEACHERS WHERE TID=CURSOR_id;--使用参数
    BEGIN
        OPEN teacher_cur(my_tid);--带上参数
        LOOP
            FETCH teacher_cur INTO teacher_name,teacher_title,teacher_sex;
            EXIT WHEN teacher_cur%NOTFOUND;
            ...
        END LOOP;
        CLOSE teacher_cur;
    END;

    特殊的游标类型

    declare  
    r_emp emp%ROWTYPE;   --该类型为emp表中一行的类型  
    cursor c_emp is SELECT * FROM emp ;  
    BEGIN  
      OPEN c_emp;  
      LOOP  
        FETCH c_emp into r_emp;     --游标中查询出来的一行into进定义的变量r_emp中  
        EXIT WHEN c_emp%NOTFOUND;  
        dbms_output.put_line('员工姓名:' || r_emp.ename);     
      END LOOP;  
      CLOSE c_emp;  
    END; 

  • 相关阅读:
    变量的创建和初始化
    HDU 1114 Piggy-Bank (dp)
    HDU 1421 搬寝室 (dp)
    HDU 2059 龟兔赛跑 (dp)
    HDU 2571 命运 (dp)
    HDU 1574 RP问题 (dp)
    HDU 2577 How to Type (字符串处理)
    HDU 1422 重温世界杯 (dp)
    HDU 2191 珍惜现在,感恩生活 (dp)
    HH实习 acm算法部 1689
  • 原文地址:https://www.cnblogs.com/tingbogiu/p/5639997.html
Copyright © 2020-2023  润新知