Oracle数据库——PL/SQL程序设计(光标)

光标就是一个结果集(Result Set)

一、光标的语法

CURSOR 光标名 [(参数名  数据类型[, 参数名  数据类型])]
   IS SELECT 语句;

例:cursor c1 is select ename from emp;

二、从光标中取值

1、打开光标

  • open c1; (打开光标执行查询)

2、取一行光标的值:

  • fetch c1 into pename; (取一行到变量中)
    fetch的作用:
    • 把当前指针指向的记录返回
    • 将指针指向下一条记录
      在这里插入图片描述

3、关闭光标

  • close c1; (关闭光标释放资源)

三、光标的具体案例

1、使用光标查询员工姓名和工资,并打印

--查询并打印员工的姓名和薪水
/*
1、光标的属性
	&found &notfound
*/
set serveroutput on
declare
--定义一个光标
cursor cemp is select ename,sal from emp;
--为光标定义对应的变量
pename emp.ename%type;
psal emp.sal%type;
begin
--打开光标
open cemp;

loop
	--取一条记录
	fetch cemp into pename, psal;
	exit when cemp%notfound;
	dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
--关闭光标
close cemp;
end;
/

在这里插入图片描述

2、按员工的职位涨工资,总裁涨1000元,经理涨800元,其他人员涨400元。

--给员工涨工资,总裁1000,经理800,其他400
set serveroutput on

declare
--定义光标代表给哪些员工涨工资
--alter table "C##SCOTT"."EMP" rename column "JOB" to empjob
  cursor cemp is select empno, empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
  --rollback;
  --打开光标
  open cemp;

loop
	--取出一个员工
	fetch cemp into pempno,pjob;
	exit when cemp%notfound;

	--判断员工的职位
	if pjob = 'PRESIDENT' then update emp set sal = sal+1000 where empno=pempno;
  elsif pjob = 'MANAGER' then update emp set sal = sal+800 where empno=pempno;
  else update emp set sal=sal+400 where empno = pempno;
	end if;
end loop;
--关闭光标
close cemp;
--对于oracle, 默认的事务隔离级别是read committed
--事务的ACID
commit;
  dbms_output.put_line('涨工资完成');
end;
/

在这里插入图片描述

四、光标的属性

%found  %notfound

%isopen 判断光标是否打开
%rowcount 影响的行数

set serveroutput on
declare
	cursor cemp is select empno, empjob from emp;
	pempno emp.empno%type;
	pjob emp.empjob%type;
begin
--打开光标
open cemp;
	if cemp%isopen then
		dbms_output.put_line('光标已经打开');
	else
		dbms_output.put_line('光标没有打开');
	end if;
--关闭光标
close cemp ;
end;
/

在这里插入图片描述

set serveroutput on
declare
	cursor cemp is select empno, empjob from emp;
	pempno emp.empnootype;
	pjob emp.empjobatype;
begin
--打开光标
open cemp;
	loop
	--取出一条记录
	fetch cemp into pempno, pjob;
	exit when cemp&notfound;
	dbms_output.put_line('rowcount:'|| cemp&rowcount);
	end loop;
--关闭光标.
close cemp;
end;
/

在这里插入图片描述

五、光标的限制

默认情况下,oracle数据库只允许在同一个会话中,打开300个光标
在这里插入图片描述
修改光标数的限制:

alter system set open_cursors=400 scope=both;

scope的取值:both(当前实例、参数文件 同时更改),
memory(只更改当前实例,不更改参数文件),
spfile(只更改参数文件,不更改当前实例,数据库需要重启)

六、带参数的光标

CURSOR 光标名 [(参数名  数据类型[, 参数名  数据类型])]
   IS SELECT 语句;

例:查询某个部门中员工的姓名

set serveroutput on
declare
	cursor cemp(dno number) is select ename from emp where deptno=dno;
	pename emp.ename%type;
begin
--打开光标
open cemp(10);
	loop
	--取出一条记录
	fetch cemp into pename;
	exit when cemp&notfound;
	dbms_output.put_line(pename);
	end loop;
--关闭光标
close cemp;
end;
/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyh17808770899/article/details/106851376