ORA-00911无效字符

时间:2014-10-13 14:47:41

标签: oracle plsql

任何人都可以帮我解决此错误

declare  
  cursor cur1 is  
    select owner,table_name from dba_tables;  
  c1 cur1%rowtype;  
  str varchar2(1000);  
begin  
  for c1 in cur1 loop  
    str:='analyze table '||c1.owner||'.'||c1.table_name||' list chained rows';  
    execute immediate str;  
  end loop;  
end;  
/  
declare
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 9

1 个答案:

答案 0 :(得分:3)

您似乎有一个表(或用户/架构)标识符,该标识符不符合通常的模式和database object naming rules,因此必须将其创建为带引号的标识符。

例如,表名以数字开头,或者名称中有空格 - 您需要检查数据字典以确切了解它的跳闸,或者在{{1}之前添加调试要做execute immediate

不管它是什么,你也可以在analyze命令中引用标识符:

dbms_output.put_line(str);

因此,如果您当前的查询生成如下命令:

    str:='analyze table "'||c1.owner||'"."'||c1.table_name||'" list chained rows';  

... analyze table MYSCHEMA.42 list chained rows 是无效标识符,修改后的版本会执行:

42

这也将处理任何混合大小写的名称,这也会导致分析失败,除非引用。

这就是为什么Oracle不推荐引用的标识符,并且通常不被任何被迫处理它们的人所厌恶。无论何时在任何地方引用标识符,都必须引用标识符,并使用与创建时完全相同的大小写。如果您有选择,请不要使用它们。

但这可能不是你的错。在我的11gR2实例上,analyze table "MYSCHEMA"."42" list chained rows 中有dba_tables的条目,它以下划线开头,以小写形式引用,从而打破了命名规则。 (那seems to have been there since at least 8.0)。无论如何,不​​确定手动分析SYS表是一个好主意,最好将其限制在您自己的模式中。

相关问题