Неожиданная ошибка «неверный символ» в Oracle 10g - PullRequest
0 голосов
/ 23 февраля 2012

Следующий запрос:

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 голосов
/ 23 февраля 2012

Я подозреваю, что имя вашего представления содержит недопустимый символ, но когда оно было создано, оно было заключено в двойные кавычки («идентификатор в кавычках» в соответствии с документами), поэтому оно было разрешено;и при запросе вы опускаете двойные кавычки.Что-то вроде:

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 создавать все ваши объекты с именами в верхнем регистре и выявлять любые проблемы во время создания объекта.

0 голосов
/ 23 февраля 2012

Я не могу воспроизвести ваш тестовый пример в 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
...