Представление Oracle с множественным объединением распознается только при использовании кавычек - почему? - PullRequest
0 голосов
/ 11 мая 2009

Я столкнулся со странным поведением при выполнении SQL-запроса в представлении Oracle. Представление содержит несколько объединений. Когда я набираю обычный sql:

select * from vView - I receive the error that view is not found
select * from "vView" - The query is executed. 

Мне интересно, почему?

Ниже мой sql:

 CREATE OR REPLACE FORCE VIEW "TMSCODE"."vCountEventsData" ("EV_ID_NUMBER", "SI_ID", "EV_YEAR", "EV_INS_DATE", "EV_REM_DATE", "EV_AADT_TOT", "EV_AADT_DIR1", "EV_AADT_DIR2", "EV_REPORT", "DIRECTION", "CNAME", "STATION_DESC") AS 
SELECT
"TMSCODE"."STC_EVENTS".EV_ID_NUMBER,
"TMSCODE"."STC_EVENTS".SI_ID,
"TMSCODE"."STC_EVENTS".EV_YEAR,
"TMSCODE"."STC_EVENTS".EV_INS_DATE,
"TMSCODE"."STC_EVENTS".EV_REM_DATE,
"TMSCODE"."STC_EVENTS".EV_AADT_TOT,
"TMSCODE"."STC_EVENTS".EV_AADT_DIR1,
"TMSCODE"."STC_EVENTS".EV_AADT_DIR2,
"TMSCODE"."STC_EVENTS".EV_REPORT,
"TMSCODE"."D_DIRECTION".DIRECTION,
"TMSCODE"."D_CONSULTANT".CNAME,
"TMSCODE"."D_STATION_TYPE".STATION_DESC
FROM
"TMSCODE"."STC_EVENTS"
INNER JOIN "TMSCODE"."D_DIRECTION" ON ("TMSCODE"."STC_EVENTS".EV_DIR = "TMSCODE"."D_DIRECTION".ID)
INNER JOIN "TMSCODE"."D_CONSULTANT" ON ("TMSCODE"."STC_EVENTS".EV_CONS = "TMSCODE"."D_CONSULTANT".ID)
INNER JOIN "TMSCODE"."D_STATION_TYPE" ON ("TMSCODE"."STC_EVENTS".EV_STATION_TYPE = "TMSCODE"."D_STATION_TYPE".ID)
WITH READ ONLY

Ответы [ 2 ]

8 голосов
/ 11 мая 2009

Представление было создано со смешанным именем. Если вы выдадите следующее (обратите внимание, что кавычек нет вокруг имен объектов)

create view karl.vView 
as 
(select * from dba_tables);

СУБД создаст представление, а затем вы найдете строку в dba_views (или user_views, если вы не видите dba_views) с именем VVIEW в верхнем регистре. Затем выберите * из karl.vview или ... из KARL.VVIEW будет работать

Если вы указали в кавычках имена объектов, то сохраните регистр, и вам придется явно сопоставить его снова с кавычками. (Это также позволит использовать пробелы в именах и других плохих сценариях. Стоит знать, чего следует избегать и уметь разрешать, когда это произойдет.

SYS@icedev> create table "TesT" (a int);

Table created.

SYS@icedev> insert into TesT values (1);
insert into TesT values (1)
            *
ERROR at line 1:
ORA-00942: table or view does not exist


SYS@icedev> insert into test values (1);
insert into test values (1)
            *
ERROR at line 1:
ORA-00942: table or view does not exist


SYS@icedev> insert into "TesT" values (1);

1 row created.

Конечно, чтобы отбросить эту таблицу, мне пришлось использовать Стол отбрасывания "TesT";

4 голосов
/ 11 мая 2009

В Oracle объекты имеют заглавные буквы, если они не заключены в кавычки. Вы использовали кавычки для создания объекта со смешанным именем регистра, поэтому теперь вы должны ВСЕГДА обращаться к объекту с помощью идентификатора в кавычках, чтобы сказать: «Не меняйте это на прописные».

...