游标、锁

/*
cursor(游标):类似于java里面的集合
1.是什么?
2.怎么定义?
3.怎么遍历?
静态游标:
隐式游标:在执行DMV操作的时候回自动生成一个隐式游标
隐式游标的变量名是固定的加:SQL
%found:对数据有影响返回true,否则返回false
%notfound:对数据没有影响返回true,否则返回false
%isopen:游标是否打开,对于隐式游标结果始终是false(关闭)
%rowcount:影响了几行数据
显示游标:在定义游标的时候已经把数据放到游标里面

动态游标:
在程序执行过程中可以给游标动态的赋值
*/

/*
静态游标
*/
declare
--定义游标
cursor c_emp is select * from emp;
--定义一个行变量接收游标里面的数据
r_emp emp%rowtype;
begin
open c_emp;
loop
fetch c_emp into r_emp;--从游标中拿出一行数据给行变量
exit when c_emp%notfound;--当无法取出数据的时候退出
dbms_output.put_line('loop循环:姓名:'||r_emp.ename);
end loop;
close c_emp;

/*
while循环
*/
open c_emp;
fetch c_emp into r_emp;
while c_emp%found loop
dbms_output.put_line('while循环:姓名:'||r_emp.ename);
fetch c_emp into r_emp;
end loop;
close c_emp;

/*
for循环:for循环在处理游标的时候会自动打开和关闭游标
*/

for f_emp in c_emp loop
dbms_output.put_line('for循环:姓名:'||f_emp.ename);
end loop;
end;

 


/*
查询部门,以及部门下面的员工
*/
declare
cursor c_emp is select * from emp;--定义游标
r_emp emp%rowtype;
begin
--打开游标
open c_emp;
loop
fetch c_emp into r_emp;
exit when c_emp%notfound;
dbms_output.put_line('部门:'||r_emp.deptno||',员工:'||r_emp.ename);
end loop;
close c_emp;
end;


/*
动态游标
*/

declare
cursor c_dept is select * from dept;--定义游标
r_dept dept%rowtype;
--用ref游标,用来存储部门下的员工信息
--定义动态游标
type type_c_emp is ref cursor return emp%rowtype;
r_emp emp%rowtype;
t_emp type_c_emp;
begin
open c_dept;
loop
fetch c_dept into r_dept;
exit when c_dept%notfound;
dbms_output.put_line('部门编号:'||r_dept.deptno||',部门名称:'||r_dept.dname);
open t_emp for select * from emp where deptno=r_dept.deptno;
loop
fetch t_emp into r_emp;
exit when t_emp%notfound;
dbms_output.put_line(' 员工编号:'||r_emp.deptno||' 员工姓名:'||r_emp.ename||' 员工薪金:'||r_emp.sal);
end loop;
close t_emp;
end loop;
close c_dept;
end;

/*https://www.cnblogs.com/zhoading/p/8547320.html
锁:
按锁的级别:
共享锁:多个事务可以同时锁定该资源
排他锁:一个事务锁定该资源,另一个事务就不能锁定该资源
按操作划分:
DML锁:这对于表数据操作的时候加的锁(add,delete,update)
DDL锁:在进行表结构操作的时候加的锁(alter,drop)
DML锁:
TM:表锁
共享TM:两个事务可以同时锁定一张表,但是执行写操作的时候只能一个事务执行
排他TM:只能被一个事务锁定,其他事务不能锁定
共享更新锁:两个事务可以同时锁定一张表,只要两个事务操作的不是同一行数据就可以同时操作
TX:行锁
排他TX:当我们执行update,add,delete的时候会自动个改行添加排他TX锁

*/

--给表添加共享表锁
lock table emp in share mode;

select * from emp where empno=7788;

--给表添加排他锁
lock table emp in exclusive mode;

--共享更新锁
lock table emp in share update mode;

--显示的添加行锁
select * from emp where empno=7788 for update;

/*
悲观锁:在执行操作一行数据之前加表锁,防止其他事物会改数据进行操作

乐观锁:不是通过在数据库层面通过锁来控制并发,而是通过程序控制(版本号)
*/

原文地址:https://www.cnblogs.com/2839888494xw/p/12985920.html