PL/SQL——光标

光标

就是一个结果集(Result Set)

 

光标的语法

CURSOR 光标名 [(参数名 数据类型[,参数名 数据类型]…)]

IS SELECT 语句;

 

一个具体的光标

cursor c1 is select ename from emp;

c1这个光标存放了emp表里所有的ename集合

 

打开光标

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

 

关闭光标

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

 

取一行光标的值

fetch c1 into pename;(取一行到变量中)

 

光标的属性

1、

%found:是否找到

%notfound:是否没找到

%isopen:判断光标是否打开

%rowcount:影响的行数

2、光标数的限制:默认情况下,oracle数据库只允许在同一个会话中,打开300个光标,所以开启光标记得关闭。

3、修改光标数的限制:alter system set open_cursors=400 scope=both;

scope的取值:

both:实例和参数文件都会被更改

memory:只更改当前实例,不更改参数文件

spfile(数据库需要重启):只更改参数文件,不更改当前实例

 

例:

--查询并打印员工的姓名和薪水

set serveroutput on

declare

--定义一个光标

cursor cemp is select ename,sal from emp;

--为光标定义对应的变量

pename emp.enmae%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;

/

 

例:

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

set serveroutput on

declare

--定义光标代表给哪些员工涨工资

cursor cemp is select empno.empjob from emp;

pempno emp.empno%type;

pjob emp.empjob%type;

begin

       --打开光标

       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;

       commit;

end;

/

 

 

带参数的光标

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/qq_37117521/article/details/81712959