Oracle游标cursor2显示的游标等

--在一中我们介绍了实现过程
select *from stud;
declare
cursor mycur is select id,name from stud;--1声明
v_id integer;
v_name varchar(30);
begin
open mycur;--2打开游标
loop--3遍历
fetch mycur into v_id,v_name;
exit when mycur%notfound;--找不到数据退出
--显示数据
DBMS_OUTPUT.PUT_LINE('编号'||v_id||'姓名'||v_name);
end loop;
if mycur%isopen then --5确定关闭
DBMS_OUTPUT.PUT_LINE('正常关闭');
close mycur;
else 
SYS.DBMS_OUTPUT.PUT_LINE('已经关闭');
end if;
exception --4关闭
when others then
SYS.DBMS_OUTPUT.PUT_LINE('异常关闭');
close mycur;
end;

--记录集类型

declare
   --声明游标
   cursor cur is select * from stud;
   --声明记录集类型
   res_stud stud%rowType;
begin
   --打开游标
   open cur;
   --遍历
   loop
      --直接将每一次获取的值,放到记录集中去
      fetch cur into res_stud;
      exit when cur%notfound;
      --输出
      dbms_output.put_line('id '||res_stud.id||' name is:'||res_stud.name);
   end loop;
   close cur;
end;
------------------------------
--直接使用 for in
--不用打开
DECLARE
CURSOR mycur1 is select * from stud;
begin
 for vv in mycur1 loop
 SYS.DBMS_OUTPUT.PUT_LINE('编号'||vv.id||''||'姓名'||vv.name);
 end loop;
 end;
--隐式

begin
 for vv in (select * from stud) loop
 SYS.DBMS_OUTPUT.PUT_LINE('编号'||vv.id||''||'姓名'||vv.name);
 end loop;
 end;

----接受参数的游标
/*
1,工具接受 
...where id=&id;
2。在游标申明时给定参数
在plsql块中使用
3。在procedure过程中使用游标

*/


--2
accept iid prompt '输入id值';
declare
cursor mycur2(p_id integer)is select * from stud where id>p_id;
v_stud stud%rowType;
begin
open mycur2(&iid);
loop
fetch mycur2 into v_stud;
exit when mycur2%notfound;
DBMS_OUTPUT.PUT_LINE(v_stud.id||''||v_stud.name);
end loop;
close mycur2;
end;



--3过程中使用
--声明一个接收参数的游标
--一个要求,sql语句是动态的

create or replace procedure px1(px_id integer)
as
  cursor cc(p_id integer) is select * from stud where id>p_id;
  v_stud stud%rowType;
begin
   --自己显式的打开,在这儿可以接收参数
   open cc(px_id);
   loop 
       fetch cc into v_stud;
       exit when cc%notfound;
       dbms_output.put_line(v_stud.id||v_stud.name);
   end loop;
   close cc;
end;
--调用
set serveroutput on;
begin
  px1(4);
end;
-----------------------------------------------------------------------------
--删除用户创建的所有表-----------慎用仅作讲解
--声明一个过程
set serveroutput on;
create or replace procedure dropall
as
   --声明一个cursor,查询用户的所有表
  cursor cur is select table_name from user_tables;
  --声明一个变量保存表名
  v_tabname user_tables.table_name%type;
begin
   open cur;
   loop
      fetch cur into v_tabname;
      exit when cur%notfound;
      dbms_output.put_line(v_tabname);
      --组成sql--在sql块中,是不可以执行DDL
      execute immediate 'drop table '||v_tabname||' purge';
   end loop;
   close cur;
end;


create table studsss(id int);
drop table stud purge;
select * from tab;
purge recyclebin;

select * from dba_users;

begin
  dropall();
end;
原文地址:https://www.cnblogs.com/xiaweifeng/p/3681611.html