Oracle学习总结----cursor
来源:互联网 发布:mysql突然高并发 编辑:程序博客网 时间:2024/06/04 00:51
--游标(光标):当需要得到多行数据时,则需要游标
--游标的四大属性:%found//找到游标,%notfound//没有找到游标.%isopen【隐士游标,该属性值一直为false】,%rowcount//游标影响的数据条数
--游标的分类:显示游标,隐士游标,自定义游标(ref游标,动态游标)
--显示游标
--游标:四个步骤:定义游标--》打开游标--》使用游标---》关闭游标
--定义游标:
cursor 游标名字(参数)is select 语句
--打开游标
open 游标名字【(参数)】 ;
--使用游标
fetch 游标名字 into 变量;
--关闭游标
close 游标名
--for循环游标:省去打开,使用,关闭
for 记录型变量 in 游标名【(参数)】 loop
end loop;
--ref游标
declare
v char(1):='&input';
temp varchar(20);
--声明游标类型
type c_type is ref cursor;
--声明动态游标明亮
c c_type;
begin
if v='D' then
--打开游标
open c for select dname from dept;
elsif v='E' then
open c for select ename from emp;
end if;
fetch c into temp;
while c%found loop
dbms_output.put_line(temp);
fetch c into temp;
end loop;
--关闭游标
close c;
end;
--游标的注意事项:
--游标关闭的之前不能重复打开
--游标关闭之后可以重复关闭
--参数类型和返回值类型不能带长度
--实例
--运用标准cursor打印所有员工
declare
--定义游标
cursor cur is select ename,job from emp;
v_ename emp.ename%type;
v_job emp.job%type;
begin
--打开游标
open cur;
--使用游标
loop
fetch cur into v_ename,v_job;
exit when cur%notfound;
dbms_output.put_line(v_ename || ' ' || v_job);
end loop;
--关闭游标
close cur;
end;
declare
v_emp emp%rowtype;
cursor cur is select emp.* from emp;
--WHILE <布尔表达式> LOOP
-- 要执行的语句;
--END LOOP;
begin
open cur;
fetch cur into v_emp;
while cur%found loop
dbms_output.put_line(v_emp.ename || ' ' || v_emp.job);
fetch cur into v_emp;
end loop;
close cur;
end;
--运用for循环cursor打印所有员工
--方法一
declare
cursor cur is select * from emp;
begin
for emp in cur loop
dbms_output.put_line(emp.ename || ' ' || emp.job || ' ' || emp.deptno);
end loop;
end;
---方法二
begin
for emp in (select * from emp) loop
dbms_output.put_line(emp.ename || ' ' || emp.job || ' ' || emp.deptno);
end loop;
end;
--答应每个部门的部门编号和部门名称,以及该部门的所有员工信息
declare
--定义获得部门编号的cursor
cursor deptCursor is select * from dept;
--定义该部门下的所有员工信息的cursor
cursor empCursor(dno emp.deptno%type) is select * from emp where deptno =dno;
begin
for dep in deptCursor loop
dbms_output.put_line(dep.deptno || ' ' || dep.dname);
for em in empCursor(dep.deptno) loop
dbms_output.put_line(' '||em.ename || ' ' || em.deptno);
end loop;
end loop;
end;
--运用标准cursor打印20号员工
declare
--定义游标
cursor cur(dno emp.deptno%type) is select * from emp where deptno = dno;
e emp%rowtype;
begin
--打开cursor
open cur('&input');
--执行游标
fetch cur into e;
while cur%found loop
dbms_output.put_line(e.ename || ' ' || e.job);
fetch cur into e;
end loop;
--关闭游标
close cur;
end;
--运用动态cursor对话框传入一个值,如果是D,输出所有的部门名称,如果是E,输出所有的员工名称
declare
flag char(1):='&input';
tabelName varchar2(10);
type c_type is ref cursor;
--声明动态游标明亮
c c_type;
ep emp%rowtype;
dp dept%rowtype;
begin
--IF <布尔表达式> THEN
--PL/SQL 和 SQL语句
--END IF;
if flag ='D' or flag ='d' then
open c for select * from emp;
fetch c into ep;
while c%found loop
dbms_output.put_line(' '||ep.ename || ' ' || ep.deptno);
fetch c into ep;
end loop;
elsif flag = 'E' or flag = 'e' then
open c for select * from dept;
fetch c into dp;
while c%found loop
dbms_output.put_line(' '||dp.deptno || ' ' || dp.dname);
fetch c into dp;
end loop;
end if;
close c;
end;
--实例定义一个存储过程,用于将员工工资小于1000的员工的薪资添加100.
create or replace procedure pro2
is
v_sal emp.sal%type;
v_empno emp.empno%type;
--定义游标
cursor emp_cursor is select empno,sal from emp;
begin
--打开游标
open emp_cursor;
loop
fetch emp_cursor into v_empno,v_sal;
exit when emp_cursor%notfound;
if v_sal<1000 then
v_sal := v_sal + 100;
update emp set sal= v_sal where empno = v_empno;
end if;
dbms_output.put_line('no is' || v_empno || 'sal is' || v_sal );
end loop;
close emp_cursor;
end;
declare
begin
pro2();
end;
select * from emp;
--游标的四大属性:%found//找到游标,%notfound//没有找到游标.%isopen【隐士游标,该属性值一直为false】,%rowcount//游标影响的数据条数
--游标的分类:显示游标,隐士游标,自定义游标(ref游标,动态游标)
--显示游标
--游标:四个步骤:定义游标--》打开游标--》使用游标---》关闭游标
--定义游标:
cursor 游标名字(参数)is select 语句
--打开游标
open 游标名字【(参数)】 ;
--使用游标
fetch 游标名字 into 变量;
--关闭游标
close 游标名
--for循环游标:省去打开,使用,关闭
for 记录型变量 in 游标名【(参数)】 loop
end loop;
--ref游标
declare
v char(1):='&input';
temp varchar(20);
--声明游标类型
type c_type is ref cursor;
--声明动态游标明亮
c c_type;
begin
if v='D' then
--打开游标
open c for select dname from dept;
elsif v='E' then
open c for select ename from emp;
end if;
fetch c into temp;
while c%found loop
dbms_output.put_line(temp);
fetch c into temp;
end loop;
--关闭游标
close c;
end;
--游标的注意事项:
--游标关闭的之前不能重复打开
--游标关闭之后可以重复关闭
--参数类型和返回值类型不能带长度
--实例
--运用标准cursor打印所有员工
declare
--定义游标
cursor cur is select ename,job from emp;
v_ename emp.ename%type;
v_job emp.job%type;
begin
--打开游标
open cur;
--使用游标
loop
fetch cur into v_ename,v_job;
exit when cur%notfound;
dbms_output.put_line(v_ename || ' ' || v_job);
end loop;
--关闭游标
close cur;
end;
declare
v_emp emp%rowtype;
cursor cur is select emp.* from emp;
--WHILE <布尔表达式> LOOP
-- 要执行的语句;
--END LOOP;
begin
open cur;
fetch cur into v_emp;
while cur%found loop
dbms_output.put_line(v_emp.ename || ' ' || v_emp.job);
fetch cur into v_emp;
end loop;
close cur;
end;
--运用for循环cursor打印所有员工
--方法一
declare
cursor cur is select * from emp;
begin
for emp in cur loop
dbms_output.put_line(emp.ename || ' ' || emp.job || ' ' || emp.deptno);
end loop;
end;
---方法二
begin
for emp in (select * from emp) loop
dbms_output.put_line(emp.ename || ' ' || emp.job || ' ' || emp.deptno);
end loop;
end;
--答应每个部门的部门编号和部门名称,以及该部门的所有员工信息
declare
--定义获得部门编号的cursor
cursor deptCursor is select * from dept;
--定义该部门下的所有员工信息的cursor
cursor empCursor(dno emp.deptno%type) is select * from emp where deptno =dno;
begin
for dep in deptCursor loop
dbms_output.put_line(dep.deptno || ' ' || dep.dname);
for em in empCursor(dep.deptno) loop
dbms_output.put_line(' '||em.ename || ' ' || em.deptno);
end loop;
end loop;
end;
--运用标准cursor打印20号员工
declare
--定义游标
cursor cur(dno emp.deptno%type) is select * from emp where deptno = dno;
e emp%rowtype;
begin
--打开cursor
open cur('&input');
--执行游标
fetch cur into e;
while cur%found loop
dbms_output.put_line(e.ename || ' ' || e.job);
fetch cur into e;
end loop;
--关闭游标
close cur;
end;
--运用动态cursor对话框传入一个值,如果是D,输出所有的部门名称,如果是E,输出所有的员工名称
declare
flag char(1):='&input';
tabelName varchar2(10);
type c_type is ref cursor;
--声明动态游标明亮
c c_type;
ep emp%rowtype;
dp dept%rowtype;
begin
--IF <布尔表达式> THEN
--PL/SQL 和 SQL语句
--END IF;
if flag ='D' or flag ='d' then
open c for select * from emp;
fetch c into ep;
while c%found loop
dbms_output.put_line(' '||ep.ename || ' ' || ep.deptno);
fetch c into ep;
end loop;
elsif flag = 'E' or flag = 'e' then
open c for select * from dept;
fetch c into dp;
while c%found loop
dbms_output.put_line(' '||dp.deptno || ' ' || dp.dname);
fetch c into dp;
end loop;
end if;
close c;
end;
--实例定义一个存储过程,用于将员工工资小于1000的员工的薪资添加100.
create or replace procedure pro2
is
v_sal emp.sal%type;
v_empno emp.empno%type;
--定义游标
cursor emp_cursor is select empno,sal from emp;
begin
--打开游标
open emp_cursor;
loop
fetch emp_cursor into v_empno,v_sal;
exit when emp_cursor%notfound;
if v_sal<1000 then
v_sal := v_sal + 100;
update emp set sal= v_sal where empno = v_empno;
end if;
dbms_output.put_line('no is' || v_empno || 'sal is' || v_sal );
end loop;
close emp_cursor;
end;
declare
begin
pro2();
end;
select * from emp;
0 0
- Oracle学习总结----cursor
- oracle cursor 总结
- oracle cursor游标总结
- Oracle Cursor用法总结
- oracle cursor学习(转摘)
- oracle cursor学习
- oracle cursor 学习小结
- oracle cursor 学习小结
- ORACLE中的游标Cursor总结
- Oracle中cursor(游标)总结
- 转Oracle Cursor用法总结
- oracle学习之:REF CURSOR
- Oracle学习笔记:游标Cursor
- Oracle中动态cursor(游标)总结
- oracle学习大全--光标设计(Cursor)
- ORACLE PL/SQL游标(cursor)学习笔记
- oracle学习笔记——游标Cursor
- 【Oracle学习】之 游标(CURSOR)
- 【算法】程序猿不写代码是不对的7
- malloc和menset
- Joda-Time简介(一)
- BZOJ 3622 已经没有什么好害怕的了
- logstash收集PHP性能分析(xhprof)日志
- Oracle学习总结----cursor
- 2017/1/18
- 在LINUX环境下工程管理器make的使用
- c++备忘1
- 代码联系
- eclipse开发web项目环境搭建
- Android-Material Design的使用
- AutoCAD 二次开发:获取填充边界
- 用C语言对移位加密进行改进