0

我在 Oracle 视图上执行 sql 查询时遇到了一个奇怪的行为。该视图包含多个连接。当我键入常规 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
4

2 回答 2

8

该视图是使用混合大小写名称创建的。如果您发出以下命令(注意对象名称周围没有引号)

创建视图 karl.vView
作为
(从 dba_tables 中选择 *);

RDBMS 将创建视图,然后您将在 dba_views(或 user_views,如果您看不到 dba_views)中找到大写名称为 VVIEW 的行。然后 select * from karl.vview 或 ... from KARL.VVIEW 将起作用

但是,如果您引用对象名称保留大小写,则必须再次明确地将其与引号匹配。(这也将允许名称中的空格和其他不良情况。值得知道要避免并在它确实发生时能够解决。

SYS@icedev> 创建表 "TestT" (a int);

表已创建。

SYS@icedev> 插入测试值 (1);
插入测试值 (1)
            *
第 1 行的错误:
ORA-00942: 表或视图不存在


SYS@icedev> 插入测试值 (1);
插入测试值 (1)
            *
第 1 行的错误:
ORA-00942: 表或视图不存在


SYS@icedev> 插入“TestT”值(1);

创建了 1 行。

当然要删除此表,我必须使用 Drop table "TestT";

于 2009-05-11T04:34:19.970 回答
4

在 Oracle 中,除非被引用,否则对象的名称都是大写的。您使用引号创建了一个混合大小写名称的对象,因此您现在必须始终使用带引号的标识符来引用该对象以说“不要将其更改为大写”。

于 2009-05-11T04:35:47.020 回答