欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PLSQL 定义游标变量两种方式 动态给游标赋值 cursor 有大用 有大大用

声明 游标变量 的两种方式

  • 使用预定义游标引用类型 SYS_REFCURSOR 声明游标变量

  • 先定义游标引用类型,然后使用 该类型 声明游标变量


DECLARE

--定义游标变量

--使用预定义游标引用类型 SYS_REFCURSOR 声明

    my_cursor SYS_REFCURSOR;

--先定义游标引用类型,然后使用 该类型 声明游标变量

    --自定义类型

    TYPE emp_cursor_type IS REF CURSOR RETURN employees%TYPE;

    TYPE general_cursor_type IS REF CURSOR;

    --使用自定义类型的游标变量

    emp_cursor emp_cursor_type;

    general_cursor general_cursor_type;

 

    --定义变量

    v_empinfo hr.employees%ROWTYPE;

    v_deptinfo hr.departments%ROWTYPE;

 

BEGIN

 

--打开游标

    --打开预定义类型

    OPEN my_cursor FOR

        SELECT * FROM departments;

    --检索游标变量与检索显示游标相似,检索游标变量只能使用简单循环或者WHILE循环,不能使用FOR循环

    LOOP FETCH my_cursor INTO v_deptinfo;

        EXIT WHEN my_cursor%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(v_deptinfo.department_id||' '|| v_deptinfo.department_name)

    END LOOP;

    CLOSE my_cursor;

 

    --打开自定义类型

    OPEN emp_cursor FOR 

        SELECT * FROM employees;

    LOOP FETCH emp_cursor INTO v_empinfo;

        EXIT WHEN emp_cursor%NOTFOUND;

        DBMS_OUTPUT.PUT_LINE(v_empinfo.employee_id||' '|| v_empinfo.employee_name)

    END LOOP;

    CLOSE emp_cursor;

    

    --How to traversing this???

    OPEN general_cursor FOR 

        SELECT employee_id,first_name,last_name,salary

        FROM employees;

    CLOSE general_cursor;

    

    

END;

 

 

来自 https://blog.csdn.net/qq_28802895/article/details/102588709




PLSQL动态游标实例


最近在学习pl/sql语句块编程,学到了游标部分,发现一个神奇的动态游标。具体题目如下:打印出所有emp开头的表的ename列数据(每个emp%表均有ename这一列)
总表结构部分如下:

select table_name, column_name
      from user_tab_columns
     where  table_name like 'EMP%' and column_name = 'ENAME'

在这里插入图片描述
注意表名和列名必须大写(别问我咋意识到的,我会告诉你我苦苦找了这个bug一个半小时吗。手动白眼)
题目要求是找出TABLE_NAME是emp开头的表,COLUMN_NAME为ename的列。

declare
  v_table_name  varchar2(30);
  v_column_name varchar2(30);
  v_column_data varchar2(40);
  cursor cur_sel_table is  --建立查表名的游标
    select table_name, column_name
      from user_tab_columns
     where table_name like 'EMP%'
       and column_name = 'ENAME';
  type cursor_type is ref cursor;--定义动态游标的类型变量
                           --除了cursor_type是随意起的,其余全是关键字
  cur cursor_type;         --定义一个动态游标类型的变量cur
begin
  open cur_sel_table;
  loop                             --循环遍历表名
    fetch cur_sel_table
      into v_table_name, v_column_name;
    dbms_output.put_line(v_table_name || ',' || v_column_name);
    exit when cur_sel_table%notfound;
    
    open cur for 'select ' || v_column_name || ' from ' || v_table_name;
    --开始内循环
    loop                           --循环遍历列名里的数据
      fetch cur
        into v_column_data;
      dbms_output.put_line(v_column_data);
      exit when cur%notfound;
    end loop;
    --结束内循环
    close cur;
    
    dbms_output.put_line(null);  --为了输出结果美观,没啥实际意义
    dbms_output.put_line(null);
    dbms_output.put_line(null);
    exit when cur_sel_table%notfound;
  end loop;
  close cur_sel_table;
end;

结果的截图:
在这里插入图片描述


来自  https://blog.csdn.net/qq_37178232/article/details/90213939



『ORACLE』 PLSQL动态游标的使用(11g)

#静态游标指的是程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成的。

动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。

从这个角度来说,静态游标的效率也比动态游标更高一些。

#游标的相关概念:

  定义:

   游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里

  存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中

  的指针 来提取游标中的数据,然后来进行操作。

  实质:

   是用户在远程客户端上对服务器内存区域的操作,由数据库为用户提供这样的

  一个指针,使得用户能够去检索服务器内存区的数据。

#游标具有的属性:

1、%ISOPEN(确定游标是否已经打开 true or false)

2、%FOUND(返回是否从结果集提取到了数据 true or false)

3、%NOTFOUND(返回是否从结果集没有提取到数据 true or false)

4、%ROWCOUNT(返回到当前为止已经提取到的实际行数)

#游标分类

一、静态游标

1、隐式游标:

      对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor

      select update/insert/delete操作

2、显示游标:

      由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor

      1)定义游标---cursor  [cursor name]  is

      2)打开游标---open    [cursor name]

      3)操作数据---fetch    [cursor name]

      4)关闭游标---close    [cursor name]

二、REF游标

1、REF 游标:动态关联结果集的临时对象。即在运行的时候动态决定执行查询。
2、REF 游标作用:实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。
3、静态游标和REF 游标的区别:

①静态游标是静态定义,REF 游标是动态关联;
②使用REF 游标需REF 游标变量。
③REF 游标能做为参数进行传递,而静态游标是不可能的。

4、REF 游标变量:是一种引用REF游标类型的变量,指向动态关联的结果集。
5、怎么使用REF游标:
①声明REF 游标类型,确定REF 游标类型;
⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。
语法:Type   REF游标名   IS   Ref Cursor Return  结果集返回记录类型;
⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。
语法:Type   REF游标名   IS   Ref Cursor;
②声明Ref 游标类型变量;
语法:变量名  已声明Ref 游标类型;
③打开REF游标,关联结果集 ;
语法:Open  Ref 游标类型变量 For 查询语句返回结果集;
④获取记录,操作记录;
语法:Fetch  REF游标名 InTo 临时记录类型变量或属性类型变量列表;
⑤关闭游标,完全释放资源;
语法:Close  REF游标名;

例:

SQL> declare
2 type emp_cursor is ref cursor;
3 my_cursor emp_cursor;
4 v_ename emp.ename%type;
5 v_sal emp.sal%type;
6 v_deptno dept.deptno%type := &p_deptno;
7 v_dname dept.dname%type;
8 begin
9 select dname into v_dname from dept where deptno = v_deptno;
10 dbms_output.put_line('Department:' || v_dname);
11 open my_cursor for
12 select ename, sal from emp where deptno = v_deptno;
13 loop
14 fetch my_cursor
15 into v_ename, v_sal;
16 exit when my_cursor%notfound;
17 dbms_output.put_line('--name:' || v_ename || 'salary:' || v_sal);
18 end loop;
19 close my_cursor;
20 end;
21 /
Enter value for p_deptno: 30
old 6: v_deptno dept.deptno%type := &p_deptno;
new 6: v_deptno dept.deptno%type := 30;
Department:SALES
--name:ALLENsalary:1600
--name:WARDsalary:1250
--name:MARTINsalary:1250
--name:BLAKEsalary:2850
--name:TURNERsalary:1500
--name:JAMESsalary:950

PL/SQL procedure successfully completed.

来自 https://www.cnblogs.com/KT-melvin/p/6854104.html


https://www.cnblogs.com/KT-melvin/p/6854104.html


普通分类: