任何人都可以帮我解决此错误
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
答案 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表是一个好主意,最好将其限制在您自己的模式中。