将ROWID添加到Oracle视图

8aqjt8rx  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(240)

当我尝试将ROWID添加到ORACLE视图中时,它出于某种原因告诉我创建一个别名。

CREATE VIEW VW_TEST_ARGUS_CLOB_2 AS
SELECT ROWID, CASE_ID_VERSION FROM T_DQ_QUEUE

生成以下内容:

ORA-00998: must name this expression with a column alias
00998. 00000 -  "must name this expression with a column alias"
*Cause:    
*Action:

所以我假设ROWID无论如何都是隐式返回的?
如果我的视图没有joins,没有groups,也没有distinct clauses,那么将ROWID添加到视图中,或者只是将视图定义为:

CREATE VIEW VW_TEST_ARGUS_CLOB_2 AS
SELECT CASE_ID_VERSION FROM T_DQ_QUEUE

然后像这样选择:

SELECT ROWID, CASE_ID_VERSION FROM T_DQ_QUEUE

也就是说,不要将ROWID添加到视图中,而是从视图外部调用它?
我对ROWID及其在VIEWS中的工作方式了解不够,以及将其添加到视图中或仅从视图外部选择它之间的区别。即,当视图仅在一个表上操作时,ORACLE是否足够聪明以返回底层表的rowid。
我不确定ROWID在视图之外如何工作(与表相关),如果视图更复杂,并且具有distinct或group by语句(或joins)。

yiytaume

yiytaume1#

ROWID是一个保留关键字。当您在视图SELECT列表中包含ROWID时,它将成为一个列名(在dba_tab_columns中可见),并且列名与任何其他用户定义的对象名称一样,不能是保留关键字。
所以,别名是... ROWID AS row_id
至于从视图中隐式地提取ROWID,如果Oracle能够确定ROWID是什么,这将起作用,只有当视图输出与原始行(仅拥有ROWID)是1:1时,它才能做到这一点,所以这就是聚合不允许ROWID的原因。它还必须知道哪个表,所以如果你在父查询块中连接两个表,它不知道从哪个表获取。
如果你在一个表上做一个直接的视图,你可以隐式地选择ROWID:

create table tab1 (col1 integer);
create or replace view view1 as select * from tab1;

SELECT ROWID  FROM view1

工作正常。如果你在这样的直接选择中遇到麻烦,那么你可能实际上是从另一个视图(T_DQ_QUEUE)中选择。检查一下这是否是一个真实的表:

SELECT object_type FROM all_objects WHERE object_name = 'T_DQ_QUEUE'

如果它是一个视图,您将需要获取视图代码并查看为什么不能从中选择ROWID。

相关问题