14:02:15 SQL> connect internal/oracle
已连接。
14:02:22 SQL> grant select on obj$ to temp;授权成功。
14:02:25 SQL> connect temp/temp
已连接。
14:02:38 SQL> declare
14:02:41   2  v_obj# number;
14:02:41   3  begin
14:02:41   4  select obj# into v_obj# from sys.obj$ where rownum=1;
14:02:45   5  end;
14:02:47   6  /PL/SQL 过程已成功完成。已用时间:  00: 00: 00.16
14:02:47 SQL>

解决方案 »

  1.   

    你那个方法是MSSQL的方法吧,
    在oracle中复制一个表是这样:
    create table ta as (select * from sys.obj$);
      

  2.   

    grant select on obj$ to user;
      

  3.   

    我已经是dba权限了,在pl/sql的Command Window里也能select那张表,在一般的SQL窗口里也能SELECT,可就是在存储函数里不行,编译不过去:
    create or replace function SF_SET_SEQ_NEXTVAL2(vcSeqName in varchar2, lNextVal in number) return number is
      Result number;
      lMinVal number;
      lMaxVal number;
      lIncVal number;            
      lCycle number;
      lOrder number;      
      lCache number;
      sCycle varchar2(10);
      sOrder varchar2(10);
      sCache varchar2(10);   
    begin            
      select s.increment$, s.minvalue, s.maxvalue, s.cycle#, s.Order$, s.cache 
      into lIncVal, lMinVal, lMaxVal, lCycle, lOrder, lCache
      from sys.obj$ o, sys.seq$ s, sys.user$ u  -- 在这里报错,说需要指明sys.obj$
      where u.name = sys.login_user() and
            u.user# = o.owner# and
            o.name = upper(vcSeqName) and
            o.obj# = s.obj#;
      if lCycle = 0 then sCycle := 'nocycle'; else sCycle := 'cycle'; end if;
      if lOrder = 0 then sOrder := 'noorder'; else sOrder := 'order'; end if;
      if lCache <= 0 then 
         sCache := 'nocache';
      else 
         sCache := 'cache '||lCache;
      end if;...
    我试了,不光obj$不行,seq$等表都不行,但是如果换成dual之类的表就没问题。
      

  4.   

    我的怎么就可以呢,不明白!
    SQL> create or replace procedure p_test_refcur is
      2  v_refcur  PKG_RefCursor.Refcursor;
      3  cursor cur is select * from sys.seq$;
      4  begin
      5  
      6    prc_Test_refcursor(v_refcur);
      7  end p_test_refcur;
      8  /Procedure created
      

  5.   

    在存储过程、函数和包中使用到的对象,如果权限不够的话,而在sql中可以执行的话,基本上都可以规类为该用户是通过角色赋权的,而实际则需要显示赋权
      

  6.   

    楼上的大虾,怎么进行“显示赋权”?
    俺对oracle并不是十分熟悉,请赐教一二。。
      

  7.   

    14:02:15 SQL> connect internal/oracle
    已连接。
    14:02:22 SQL> grant select on obj$ to temp;授权成功。这就是显示赋权限。
      

  8.   

    上面都说的很清楚了,就是grant priv on object_name to user_name;
      

  9.   

    谢谢,可否再问一个小问题,也是权限的,俺想在SP里create一个sequence,提示权限不够,应该怎么赋权?
      

  10.   

    grant create sequence to user_name;