0

以下查询:

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 *从其他视图和表正常工作。

欢迎任何提示。

4

2 回答 2

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 参考中有一个关于命名对象的部分;我猜你违反了规则 7。

将对象名称用双引号括起来并不是一种好的做法(尽管我确信意见会有所不同),通常是因为它会导致大小写差异的问题,但可能会产生类似这样的其他微妙影响。去掉引号要容易得多,让 Oracle 使用大写名称创建所有对象,并在对象创建时发现任何问题。

于 2012-02-23T16:17:34.303 回答
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
于 2012-02-23T15:28:18.900 回答