日期:2014-05-16  浏览次数:20787 次

请教DBMS_METADATA.GET_DDL报错 error stack
pl/sql执行

SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) 
  FROM ALL_TABLES u
  WHERE u.owner = 'COMM' and u.nested='NO' 
  AND (u.iot_type is null or u.iot_type='IOT');

error stack


CMD窗口执行

SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
  2 FROM ALL_TABLES u
  3 WHERE u.owner = 'COMM' and u.nested='NO'
  4 AND (u.iot_type is null or u.iot_type='IOT');
ERROR:
ORA-31603: 对象 "AAAA" 属于类型 TABLE, 在方案 "SYS" 中未找到
ORA-06512: 在 "SYS.DBMS_METADATA", line 1968
ORA-06512: 在 "SYS.DBMS_METADATA", line 2011
ORA-06512: 在 "SYS.DBMS_METADATA", line 2343
ORA-06512: 在 "SYS.DBMS_METADATA", line 3247
ORA-06512: 在 "SYS.DBMS_METADATA", line 4863
ORA-06512: 在 line 1


我看网上的解释是共享池和java pool太小了 我手动更改了一下 还是报这个错

在此请教各位高手了

------解决方案--------------------
数据量太大了,那就写个循环来取吧

SQL code
begin
  for rec in (
    select table_name from all_tables u
      where u.owner = 'COMM' and u.nested='NO'
      and (u.iot_type is null or u.iot_type='IOT'))  loop
    dbms_output.put_line(dbms_metadata.get_ddl('TABLE', rec.table_name));
  end loop;
end;

------解决方案--------------------
提示很明确,ORA-31603: 对象 "AAAA" 属于类型 TABLE, 在方案 "SYS" 中未找到
这个表是用户 COMM的,而不是sys的。
所以,再调用的时候,应该加上属主参数
DBMS_METADATA.GET_DDL('TABLE',u.table_name,'COMM');