显式游标
显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。
1、创建测试表,插入 测试数据
CREATE TABLE student1 (
sname varchar (20),
sage INTEGER,
semall varchar (20),
sphone VARCHAR (20),
saddress varchar (20)
);
insert into STUDENT1 (sname, sage, semall, sphone, saddress)
values (‘zhangsan’, 12, ‘zhu@163.com’, ‘1516127783’, ‘nanjing2’);
insert into STUDENT1 (sname, sage, semall, sphone, saddress)
values (‘zhangsan’, 15, ‘ss@163.com’, ‘1216127783’, ‘nanjing3’);
insert into STUDENT1 (sname, sage, semall, sphone, saddress)
values (‘zhangsan’, 17, ‘gfdf@163.com’, ‘16161271183’, ‘nanjing4’);
insert into STUDENT1 (sname, sage, semall, sphone, saddress)
values (‘zhangsan’, 82, ‘34df@163.com’, ‘1816127783’, ‘nanjing5’);
commit;
2、编写存储过程
create or replace procedure PRINTSTUDENT(sname in out varchar,sage in varchar)
as resultCount number; ----这里is,as都可以
begin
select count(1) into resultCount from student1;
if(resultCount = 4) then
resultCount := 4;
DBMS_OUTPUT.PUT_LINE(‘has 4 student’);
else
resultCount := 1;
DBMS_OUTPUT.PUT_LINE(‘has 1 student’);
end if;
exception
----这里写异常处理信息,常用处理方法when then—when others then—end;
when too_many_rows then
DBMS_OUTPUT.PUT_LINE(‘返回值多于1行’);
when others then
DBMS_OUTPUT.PUT_LINE(‘在printStudent过程中出错!’);
end;
3、编写显式游标调用存储过程
–显式游标的使用
declare
CURSOR C4(tname varchar,tage number) --申明游标
is
select sname,sage from student1 where sname = tname and sage = tage;
v_emp_record C4%ROWTYPE;
counts number; --计数器
begin
counts := 0;
OPEN C4(‘zhangsan’,12); --打开游标
LOOP
FETCH C4 INTO v_emp_record;
IF C4%FOUND THEN
DBMS_OUTPUT.PUT_LINE(counts ||’ ‘|| v_emp_record.sname || ’ 的年龄是:’ || v_emp_record.sage);
counts := counts +1;
ELSE
DBMS_OUTPUT.PUT_LINE(counts ||’ ‘||‘已处理’ );
counts := counts +1;
EXIT WHEN c4%NOTFOUND;
END IF;
END LOOP;
CLOSE C4; --关闭游标
END;
4、使用for循环 loop 游标
declare
CURSOR C4(tage number) --申明游标
is
select sname,sage from student1 where sage < tage;
counts number; --计数器
begin
counts := 0;
FOR everyC in C4(19) LOOP
DBMS_OUTPUT.PUT_LINE(counts ||’ ‘|| everyC.sname || ’ 的年龄是:’ || everyC.sage);
counts := counts +1;
END LOOP;
END;
FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;
1、进入循环,自动打开游标,并提取一行数据;
2、程序处理完提取的数据,游标自动转移下一行数据;
3、循环结束,游标自动关闭。
隐式游标
对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,隐式游标的名字为SQL,这是由ORACLE 系统定义的。
对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。
格式调用为: SQL%
–隐式游标
declare
v_rows number;
begin
update student1 set sage = 22 where sname = ‘zhangsan’;
v_rows := SQL%ROWCOUNT;
DBMS_OUTPUT.put_line(‘更新了’ || v_rows||‘行’);
delete from student1 where sname=‘aa’;
if SQL%notfound then
delete from student1 where sname =‘wanger’;
end if;
end;