以下查询:
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 *
正常工作。
欢迎任何提示。
答案 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用大写名称创建所有对象,并在对象创建时发现任何问题。