sys as sysdba用户下:
create or replace procedure do_work( p_what in varchar2 )
as
  l_redo_size number;
  begin
     select v$mystat.value-l_redo_size into l_redo_size from v$mystat, v$statname
          where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
  end;
/
是正确编译成功的。在我自己的用户test下
SQL>select v$mystat.value from v$mystat, v$statname
          where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
是执行成功的
但是在test下创建过程do_work出现编译错误,不知道是为什么。

解决方案 »

  1.   

    没有权限,需要明确授权,并且其它用户访问的v$mystat,v$statname是一个同义词
    需要在其原始对象上授权
    使用sys授权:
    grant select on v_$mystat to test;
    grant select on v_$statname to test;
      

  2.   

    呵呵,成功了,为什么是v_$mystat呢?有个下划线,它和v$mystat之间关系是怎样的呢?
    v_$statname和v$statname的呢?
    谢谢啦
      

  3.   

    v_$statname是属于sys用户的视图
    其它用户看到的是基于视图v_$statname建立的同义词v$statname