--游标
--今天的任务 3个
-- 1 上节课结尾的时候
-- 函数 没讲完 补一下
-- 2 游标
--新的学习
-- 3 作业
-- 简单说一下
-- 我基本上没布置过
-- 1 布置作业
-- 2 把所有的上课讲的笔记全部发给你们
-- 3 作业一共12次 全部发给你们 给一周的时间做
--游标
--1 游标的创建
CURSOR SURSOR_name is cudr(语句)
--2 游标的打开
open SURSOR_name;
--3 游标的读取
FETCH SURSOR_name INTO SURSU存储变量
--4 游标的关闭
close SURSOR_name;
-- 注意 这个开关 默认是关闭的
SET SERVEROUTPUT ON
DECLARE
CURSOR SURSOR_student is
select *
from student;
s student%ROWTYPE; -- : 创建了一共student的变量s
BEGIN
--2 游标的打开
open SURSOR_student;
--3 游标的读取
FETCH SURSOR_student INTO s;
--4 游标的关闭
close SURSOR_student;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
END;
/
-- 带loop 的游标
-- 注意 这个开关 默认是关闭的
SET SERVEROUTPUT ON
DECLARE
CURSOR SURSOR_student1 is
select *
from student;
s student%ROWTYPE; -- : 创建了一共student的变量s
BEGIN
--2 游标的打开
open SURSOR_student1;
loop
--3 游标的读取
FETCH SURSOR_student1 INTO s;
exit when SURSOR_student1 %notfound;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
end loop;
--4 游标的关闭
close SURSOR_student1;
END;
/
SET SERVEROUTPUT ON
DECLARE
CURSOR SURSOR_student1 is
select sname,ssex,sage,sno
from student;
--where sno='s001';
--s student%ROWTYPE; -- : 创建了一共student的变量s
no varchar2(10) ;
name varchar2(20);
age number(2);
sex varchar2(5);
BEGIN
--2 游标的打开
open SURSOR_student1;
loop
--3 游标的读取
FETCH SURSOR_student1 INTO name,sex,age,no;
exit when SURSOR_student1 %notfound;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||name); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||sex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||age); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||no); --换行打印
end loop;
--4 游标的关闭
close SURSOR_student1;
END;
/
/*
SET SERVEROUTPUT ON
DECLARE
CURSOR SURSOR_student1 is
select sname,ssex,sage,sno
from student;
--where sno='s001';
--s student%ROWTYPE; -- : 创建了一共student的变量s
-- 创建了游标 这个游标是查询语句
no varchar2(10) ;
name varchar2(20);
age number(2);
sex varchar2(5);
--定义了4个变量用于后面的存储
BEGIN
--2 游标的打开
open SURSOR_student1;
loop
--3 游标的读取
FETCH SURSOR_student1 INTO name,sex,age,no;
exit when SURSOR_student1 %notfound;
--退出条件 当游标读取为空的时候退出游标的循环读取
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||name); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||sex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||age); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||no); --换行打印
end loop;
--4 游标的关闭
close SURSOR_student1;
END;
/
*/
SET SERVEROUTPUT ON
DECLARE
CURSOR SURSOR_student1 is
select *
from student;
--where sno='s001';
s student%ROWTYPE; -- : 创建了一共student的变量s
BEGIN
--2 游标的打开
open SURSOR_student1;
loop
--3 游标的读取
FETCH SURSOR_student1 INTO s;
exit when SURSOR_student1 %notfound;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
end loop;
--4 游标的关闭
close SURSOR_student1;
END;
/
-- 使用 cursor for loop 循环读取游标的信息
DECLARE
CURSOR SURSOR_student1 is
select *
from student;
--where sno='s001';
BEGIN
for i in SURSOR_student1 loop
DBMS_OUTPUT.PUT_LINE('学生姓名:'||i.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||i.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||i.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||i.sno); --换行打印
END loop;
END;
/
-- 带参数的游标
SET SERVEROUTPUT ON
DECLARE
no student.sno%type:= 's005';
s student%ROWTYPE; -- : 创建了一共student的变量s
CURSOR SURSOR_student(v_sno varchar2) --括号里面是形参内容
is
select *
from student
where sno = v_sno;
BEGIN
--2 游标的打开
open SURSOR_student(no);
--3 游标的读取
FETCH SURSOR_student INTO s;
--4 游标的关闭
close SURSOR_student;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
END;
/
-- 带参数的循环游标
DECLARE
no student.sno%type:= 's00%';
s student%ROWTYPE; -- : 创建了一共student的变量s
CURSOR SURSOR_student(v_sno varchar2) --括号里面是形参内容
is
select *
from student
where sno like v_sno;
BEGIN
for i in SURSOR_student(no) loop
DBMS_OUTPUT.PUT_LINE('学生姓名:'||i.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||i.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||i.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||i.sno); --换行打印
END loop;
END;
/
SET SERVEROUTPUT ON
DECLARE
vv_no varchar2(10):='s00%';
vv_sex varchar2(5):='男';
CURSOR SURSOR_student1 (v_no varchar2,v_sex varchar2)
is
select sname,ssex,sage,sno
from student
where sno like v_no and
ssex=v_sex;
--s student%ROWTYPE; -- : 创建了一共student的变量s
no varchar2(10) ;
name varchar2(20);
age number(2);
sex varchar2(5);
BEGIN
--2 游标的打开
open SURSOR_student1(vv_no,vv_sex);
loop
--3 游标的读取
FETCH SURSOR_student1 INTO name,sex,age,no;
exit when SURSOR_student1 %notfound;
--打印内容
DBMS_OUTPUT.PUT_LINE('学生姓名:'||name); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||sex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||age); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||no); --换行打印
end loop;
--4 游标的关闭
close SURSOR_student1;
END;
/
DECLARE
no student.sno%type:= 's00%';
sex student.ssex%type:='女';
s student%ROWTYPE; -- : 创建了一共student的变量s
CURSOR SURSOR_student(v_sno varchar2,v_ssex varchar2) --括号里面是形参内容
is
select *
from student
where sno like v_sno and ssex=v_ssex;
BEGIN
for i in SURSOR_student(no,sex) loop
DBMS_OUTPUT.PUT_LINE('学生姓名:'||i.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||i.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||i.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||i.sno); --换行打印
END loop;
END;
/
--隐式游标
DECLARE
no student.sno%type:= 's001';
--sex student.ssex%type:='女';
s student%ROWTYPE; -- : 创建了一共student的变量s
BEGIN
select *
into s
from student
where sno = no;
--where sno like no and ssex=sex;
if SQL%found then
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
end if;
END;
/
%found -- 更删改查是否影响到数据 判断sql 是否执行成功
%notfound -- 判断sql 语句是否执行失败