--声明游标;
--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;