光标/ 游标
就是一个结果集
CURSOR 光标名 [(参数名 数据类型[,参数名 数据类型])] -- 参数可有可无
IS SELECT 语句;
Cursor c1 is select ename where emp
使用之前 需要 open c1; (打开光标)
使用完了 需要 close c1; (关闭光标)
从光标中 取一行关键字 fetch
Fetch c1 into pename; (取一行到变量中)
Fetch 的作用
- 把当前指针指向的记录返回
- 将指针指向下一条记录
光标的属性
-
如果这个found能取到数据这个found就是true 否则就是false
%found -
与上面相反
%notfound -
判断光标是否打开
%isopen -
影响的行数 不是总行数 (已经取走的数)
%rowcount
光标数量的限制
默认的情况下 oracle 数据库只允许打开到 300个光标
修改光标数的限制
alter system set open_ cursors =400 scope=both;
scope 的取值 both,memory,spfile
memory:只更改当前实例 不更改参数文件
spfile: 只更改参数文件,不更改实力 数据库需要重启
both:以上两个同时做
查询并打印员工的姓名和薪水
Declare
Cursor cemp is select ename,sal from emp; (cemp 代表所有姓名薪水的集合)
--建议写完上面后立即为光标定义对应的变量
Pename emp.ename%type
Psal emp.esal%type;
Begin
--打开光标
Open cemp;
Loop
--取一条记录
Fetch cemp into pename,psal;
--fetch不一定能取到
Exit when cemp%notfound;(没有取到记录时为true)
--打印
Dbms_output.put_line(pname)
End loop;
带参数的光标
Cursor cemp(dno number) is select ename from emp where deptno = dno;
Begin
Open cemp(20);
Loop
事务隔离性
对于oracle
Plsql 要考虑事务隔离性
Oracle
默认隔离级别是 read committed
事务的ACID 原子性 一致性 隔离性 持久性
在oracle中 若对于数据有更改的则需要
Commit;