当我尝试将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)。
1条答案
按热度按时间yiytaume1#
ROWID是一个保留关键字。当您在视图SELECT列表中包含ROWID时,它将成为一个列名(在dba_tab_columns中可见),并且列名与任何其他用户定义的对象名称一样,不能是保留关键字。
所以,别名是...
ROWID AS row_id
至于从视图中隐式地提取ROWID,如果Oracle能够确定ROWID是什么,这将起作用,只有当视图输出与原始行(仅拥有ROWID)是1:1时,它才能做到这一点,所以这就是聚合不允许ROWID的原因。它还必须知道哪个表,所以如果你在父查询块中连接两个表,它不知道从哪个表获取。
如果你在一个表上做一个直接的视图,你可以隐式地选择ROWID:
工作正常。如果你在这样的直接选择中遇到麻烦,那么你可能实际上是从另一个视图(T_DQ_QUEUE)中选择。检查一下这是否是一个真实的表:
如果它是一个视图,您将需要获取视图代码并查看为什么不能从中选择ROWID。