静态游标 动态游标区别_动态sql和静态sql的区别

(4) 2024-08-28 13:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
静态游标 动态游标区别_动态sql和静态sql的区别,希望能够帮助你!!!。

静态游标 动态游标区别_动态sql和静态sql的区别_https://bianchenghao6.com/blog__第1张

1 什么是游标?

当在PL/SQL块中执行DML(增删改查)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针

2 游标分类?

显示游标和隐式游标

3 游标的属性

  • %FOUND ---在结果集中找到了记录

  • %NOTFOUND ---在结果集中没有找到记录

  • %ROWCOUNT ---当前已经从游标中获取的记录数量

  • %ISOPEN ---是否打开

  • %BULK_ROWCOUNT ---在forall操作中,Sql%rowcount表示commit之前被影响的记录总行数,而sql%bulk_rowcount(i)表示每一次的操作所影响的行数,该值是存在一个集合里,forall中的第n条dml语句处理的行数存储在该集合的第n个元素中

  • %BULK_EXCEPTION

下面介绍隐式游标和显示游标的用法


    a 隐式游标

    对于数据库操纵语句和单行SELECT INTO语句来说,Oracle会为它们分配隐含游标。

    DECLARE

    r NUMBER;

    BEGIN

    UPDATE emp e SET e.sal=4000 WHERE e.deptno=20;

    r := SQL%ROWCOUNT; --隐式游标

    IF(SQL%FOUND)THEN --隐式游标

    dbms_output.put_line(r);

    END IF;

    END;

    b 显示游标

    显示游标操作步骤

    • 解析:确保SQL语句有效,然后才决定执行计划。

    • 绑定:将PL/SQL中变量与绑定变量关联。

    • 打开:打开游标。

    • 执行:执行游标中的SELECT语句。

    • 提取:提取游标的当前行后指针移到下一行。

    • 关闭:关闭游标。

    实例:显示大于3000元工资的员工姓名

    第一种写法

    declare

    cursor emp_cur is select * from emp wheresal>;

    emp_row emp%rowtype;

    begin

    for x in emp_cur

    loop

    dbms_output.put_line('姓名为:'||x.ename);

    end loop;

    end;

    第二种写法

    declare

    --定义游标cur_emp

    cursor cur_emp is select * from emp where sal>3000;

    --定义一个人员表的变量

    v_emp emp%rowtype;

    begin

    --打开游标

    open cur_emp;

    loop

    fetch cur_emp into v_emp ;--从游标中获取数据

    exit when cur_emp%notfound ;--当游标执行完成时,退出

    dbms_output.put_line(v_emp.ename||'薪酬是:'||v_emp.sal);

    end loop;

    close cur_emp ;--关闭

    end ;

    游标还可以带参数

    --用户输入一个部门编号.

    --要求将该部门下的员工的工资全部增加200,并输出增加后的工资和姓名

    declare

    v_depno dept.deptno%type;

    cursor cur_emp(v_dep number) is

    select * from emp e where e.deptno=v_dep;

    v_emp emp%rowtype;

    begin

    v_depno:=&输入部门ID;

    open cur_emp(v_depno) ;

    loop

    fetch cur_emp into v_emp;

    exit when cur_emp%notfound ;

    update emp e set e.sal=e.sal+300 where e.empno=v_emp.empno;

    dbms_output.put_line(v_emp.ename||' '||(v_emp.sal+300));

    end loop;

    close cur_emp;

    commit;

    end ;

    以上为简单使用静态游标(强类型).下面演示动态游标(弱类型)的用法

    --定义一个动态游标,pl/sql中分别打开两个不同的表

    declare

    cur_temp SYS_REFCURSOR; --定义动态游标

    v_emp emp%rowtype;

    v_dept dept%rowtype;

    begin

    --员工游标

    open cur_temp for select * from emp;

    loop

    fetch cur_temp into v_emp;

    exit when cur_temp%notfound ;

    dbms_output.put_line(v_emp.ename);

    end loop;

    close cur_temp;

    --部门游标

    open cur_temp for select * from dept;

    loop

    fetch cur_temp into v_dept;

    exit when cur_temp%notfound ;

    dbms_output.put_line(v_dept.dname);

    end loop;

    close cur_temp;

    end;

    以上语句有oracle客户端的网友,使用scott账号登录之后,可以直接测试。希望对大家有所帮助。

    静态游标 动态游标区别_动态sql和静态sql的区别_https://bianchenghao6.com/blog__第2张

    游标的分类

    静态游标 动态游标区别_动态sql和静态sql的区别_https://bianchenghao6.com/blog__第3张

    今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

    上一篇

    已是最后文章

    下一篇

    已是最新文章

    发表回复