问题1:没有遇到过这种情况,如果真的这样,那你的数据库数据字典坏了,赶紧备份先
问题2:在执行以前,先把缓冲区设大一些,比如set serveroutput on size 1000000
问题3:我这边没有这个问题,all_tab_columns等数据字典都有公共同义词,不可能访问不到,只可能没有权限select。table not exists和no privelege to access是不同的错误。
问题4:用pl/sql子块把exception控制在该子块内
create procedure myproc (...) is
...
begin
  ...
  begin
    exception when ...
     ...;
  end;
  ...end;

解决方案 »

  1.   

    问题1:我记得有本书上说因为数据字典表不比动态性能视图,是不动态更新的。但是我做的测试和实际的使用中,发现是动态变化的,不可能出现你的那种情况。
    问题2我不说了。
    问题3:你需要dba的权限或是select any table的系统特权,建议用user_tables。
    问题4:建议参考oracle异常与高级异常
      

  2.   

    KingSunSha(弱水三千),事实上,我并没有执行dmbs_output.putline,也需要设置set serveroutput on size 1000000码?
      

  3.   

    没有执行dmbs_output.put_line就不可能出现“缓冲区超出40000BYTE”的错误,当然不用set serveroutput
      

  4.   

    问题1:可能你的表的名称有问题。解决方法:生成语法时在表名前后加双引号(例如:"TABNAME"),但加双引号时,不要转换大小写。出现你说的错误的原因可能有两个。1、表名中含有小写字母;2、表名与ORACLE内部标示符同名,例如:user,column等。当然列也一样,最好名字前后加双引号。
    问题2:保留 KingSunSha(弱水三千) 的说法
    问题3:如果需要查看所有用户下的表,则要有select any table权限,不能显示,并不是不能访问。
    问题4:如下将循环体放在一个子块中,在子块中处理异常,而且一定要扑获所有异常,既使用:when others 语句。
    begin
      ...
      loop ..
        begin
          ...
          exception 
           when others then
           ...;
        end;
      end loop;
      ...
    end;
      

  5.   

    问题1:可能你的表的名称有问题。解决方法:生成语法时在表名前后加双引号(例如:"TABNAME"),但加双引号时,不要转换大小写。出现你说的错误的原因可能有两个。1、表名中含有小写字母;2、表名与ORACLE内部标示符同名,例如:user,column等。当然列也一样,最好名字前后加双引号。
    问题2:保留 KingSunSha(弱水三千) 的说法
    问题3:如果需要查看所有用户下的表,则要有select any table权限,不能显示,并不是不能访问。
    问题4:如下将循环体放在一个子块中,在子块中处理异常,而且一定要扑获所有异常,既使用:when others 语句。
    begin
      ...
      loop ..
        begin
          ...
          exception 
           when others then
           ...;
        end;
      end loop;
      ...
    end;
      

  6.   

    只有40000BYTE的问题没有解决了,实质上我并没有运行dmbs_output.put_line。 我会尽快结帖。
      

  7.   

    试试看加一句 dbms_output.enable(10000000)