• 游标、锁


    /*
    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;

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

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

  • 相关阅读:
    博客开通第77天
    guzzlephp使用教程
    Mac下php70memcache安装
    opcache开启和关闭
    php的getimagesize方法详解
    Yii2框架解剖
    AES加密:PHP与Java互通问题
    公司网页监控到的各种不能识别的浏览器userAgent,都是些什么啊
    document.write
    js模版引擎v6注解
  • 原文地址:https://www.cnblogs.com/2839888494xw/p/12985920.html
Copyright © 2020-2023  润新知