• oracle学习 九 游标的使用(持续更)


       为什么要使用?

            笔者查阅了一些资料之后得到的结论是,

        关系型数据库是面向集合的,而游标是面向行的,游标可对取出来的集合(结果集)中每一行进行相同或不同的操作,还提供对基于游标位置而对表中数据进行删除或更新的能力,某些特     殊的查询操作也可以通过游标去完成,让你在查询暂时没办法的时候多了一种选择。
    游标的类型?
    游标分为:
        1、fetch 定义的游标名 into 游标变量
        2、for 游标变量 in 游标名 loop
       两种方式,其中for方式是隐式游标,可以对数据库后台进行打开关闭的操作,fetch是显示游标,需要操作者自行打开关闭,关于二者优劣网上说法不一,但是个人来看,还是for的方   式比较简便。
    游标语法:
      有以下例子:
      for:
      
    declare
    --定义游标
    cursor c_job
    is
    --查询的语句
    select user_id,user_name from t_user_info;
    --定义游标变量
    c_row c_job%rowtype;
    begin
      --使用游标变量在游标中进行检索
      for c_row in c_job loop
        dbms_output.put_line(c_row.user_id||'-'||c_row.user_name);
      --循环条件结束
      end loop;
    end;

    fetch:

    DECLARE
      -- 定义游标.
      CURSOR c_test_main IS
        SELECT user_id, user_name FROM t_user_info;
      -- 保存游标数据的变量
      v_main_data c_test_main%ROWTYPE;
    BEGIN
      -- 打开游标.
      OPEN c_test_main;
      LOOP
        -- 填充数据(主表).
        FETCH c_test_main INTO v_main_data;
        -- 假如没有检索到(主表)数据,结束循环处理
        Exit when c_test_main%NOTFOUND;
    
        dbms_output.put_line(v_main_data.user_id||'-'||v_main_data.user_name);
      
      END LOOP;
      -- 关闭游标
      CLOSE c_test_main;
    END;

    备注?

     1、 

    dbms_output.put_line('输出内容');

     2、

    游标变量名  表名%rowtype
    
    游标变量名  游标名%rowtype

    个人测试了以下,声明游标变量的两种方法中   

    游标变量名  游标名%rowtype  
    这种方式运行的速度更快一点,它是再说这个变量是一行数据的实例,
    类似于游标里的一行数据。而
    游标变量名  表名%rowtype

    这个方法是说这个变量是表中的一个实例,类似于表里的一行数据。
    一种简单的操作方法也可以是这样的:
    declare
      n_count    number;
    begin
      for cur_record in(
        --游标要查询的集合
       select t.category_id from AM_CATEGORY t)
      loop
        --游标执行的内容
           execute immediate 'update am_'||cur_record.category_id||'_entry set storage_id=null where storage_id is not null';
           DBMS_output.put_line('update am_'||cur_record.category_id||'_entry set storage_id=null where storage_id is not null');
      end loop;
      --commit;
    end;
    
    
    其中excute immediate是为了解决动态拼接表名进行游标式表数据更新的一种方式 ,EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交 ,刚动态拼接的表不会马上存在,1. EXECUTE IMMEDIATE会让这个表理科变成真实的表,这样就可以及时使用了
    cur_record.category_id:游标名.查询的字段名称
    不是动态的表一般不用到
    excute immediate
    如:
    declare
      cur_entryid  number;
    begin
      for cur_entryid in(
        --游标要查询的集合
       select entry_id from AM_AJ_ENTRY )
      loop
        --游标执行的内容
            delete from AM_AJ_datum t where t.entry_id =cur_entryid.entry_id;
      end loop;
      --commit;
    end;
  • 相关阅读:
    采样错误
    MathJax
    jupyter
    pip
    str操作
    Content-Type
    json转csv
    【tornado】静态文件
    dict 字典
    基于插件技术的GIS应用框架(C# + ArcEngine9.3)(一)
  • 原文地址:https://www.cnblogs.com/llcdbk/p/4218746.html
Copyright © 2020-2023  润新知