Oracle 10g中出现意外的“无效字符”错误

时间:2012-02-23 14:01:02

标签: sql oracle10g ora-00911

以下查询:

SELECT * FROM VIEW_NAME_HERE

导致ORA-00911: invalid character错误。我尝试使用SQL Developer,Oracle SQL Developer,Toad和java应用程序执行它。

VIEW_NAME_HERE是一个观点。用于创建视图的SQL查询如下:

SELECT DISTINCT table1_alias.id2 AS col1 ,
                table1_alias.col2,
                table1_alias.col3
FROM table1
INNER JOIN table1 table1_alias
   ON table1.id1 =table1_alias.id2
WHERE  table1_alias.id2<>-55   AND table1_alias.LVL=1
UNION
SELECT col1 ,col2,col3
FROM table2 WHERE col1> 0 AND col4 = 1
AND LVL = 2
来自其他视图和表的

SELECT *正常工作。

欢迎任何提示。

2 个答案:

答案 0 :(得分:0)

我无法在Oracle 10g上重现您的测试用例:

SQL> create table table1 (id2 number, col2 number, col3 number, id1 number, lvl number);

Table created.

SQL> create table table2 (col1 number, col2 number, col3 number, col4 number, lvl number);

Table created.

SQL> create view view_name_here as
  2  SELECT DISTINCT table1_alias.id2 AS col1 ,
  3                  table1_alias.col2,
  4                  table1_alias.col3
  5  FROM table1
  6  INNER JOIN table1 table1_alias
  7     ON table1.id1 =table1_alias.id2
  8  WHERE  table1_alias.id2<>-55   AND table1_alias.LVL=1
  9  UNION
 10  SELECT col1 ,col2,col3
 11  FROM table2 WHERE col1> 0 AND col4 = 1
 12  AND LVL = 2;

View created.

SQL> select * from view_name_here;

no rows selected

答案 1 :(得分:0)

我怀疑你的视图名称包含一个无效字符,但是当它被创建时,名字被用双引号括起来(根据文档的'引用标识符')所以它是允许的;当查询你省略双引号时。类似的东西:

create view "MY~VIEW" as select * from dual;

View created.

select * from MY~VIEW;
                *
Error at line 1:
ORA-00911: invalid character

但这有效:

select * from "MY~VIEW";

D
-
X

当然,实际角色可能是其他角色,但错误(至少在SQL * Plus中)有助于使用*突出显示它。 SQL引用有一个section on naming objects;我猜你违反了规则7。

用双引号括起对象名称不被认为是好习惯(虽然我确定意见各不相同),通常是因为它会导致案例差异出现问题,但可能会产生其他微妙的影响。离开引号要容易得多,让Oracle用大写名称创建所有对象,并在对象创建时发现任何问题。