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;