因为需要批量创建同义词,所以使用了 all_objects 表,而游标就是遍历这张表的数据。
定义了 cursor cur_obj is …… , 把 is 后面的 select 语句单独拿出来执行是 101 行结果,这些结果基本一致,没有什么不同。
然后使用 for in 遍历,每次 输出  cur_obj%rowcount , 最后输出的结果居然是 98 ,少的这3条数据我已经找到了。
我想问的是,为什么会少 3 条数据? 我的过程很简单,就是 声明 cursor , 遍历, 输出 rowcount, 除此之外什么事情都没做。 是不是 cursor 使用的时候有什么限制 , 或者需要注意的地方 ?

解决方案 »

  1.   

    本来,我也是认为和数据内容有关,但是我查询语句hi select 1 from xxxx,这个应该是和内容无关了吧? 至于那 3 条语句,因为在内网里面,不太好拷出,就不好拿出来。
      

  2.   


    create or replace procedure pro_setsynonyms is  v_privs all_objects%rowtype;
      v_tab   v_privs.object_name%type;
      v_owner all_objects.OWNER%type;
      v_sql   varchar2(1000);begin  v_tab := '';
      for v_privs in (select *
                        from all_objects t
                       where t.owner like 'SBP%'
                       and exists
                       (select *
                                from user_tab_privs s
                               where s.OWNER = t.OWNER
                                 and s.OWNER <> s.GRANTEE
                                 and s.OWNER in ('SBPBS'))
                         and t.OBJECT_TYPE in ('TABLE', 'VIEW', 'SEQUENCE')) loop
        v_tab   := v_privs.object_name;
        v_owner := v_privs.owner;    v_sql := 'CREATE OR REPLACE SYNONYM ' || v_tab || ' FOR ' || v_owner || '.' ||
                 v_tab || ';';    dbms_output.put_line(v_sql);  end loop;end pro_setsynonyms;