我试图从DBA_USERS中检索一个USER ID,就像我们在DBA_ROLES中一样。
我已尝试从DBA_ROLES中检索ROWID列,但我收到此警告:
“ ORA-01445:无法从没有密钥保留表的连接视图中选择ROWID或采样”
根据我的理解,DBA_USERS是Oracle生成的视图,无法检索此ROWID。我是对的吗?
如果这是正确的,我怎么知道从哪个表生成这个视图?或者我怎么知道用户的ROWID?
亲切的问候!
萨姆
答案 0 :(得分:4)
我正在尝试从DBA_USERS
中检索USER ID
您正在寻找DBA_USERS.USER_ID
:
SQL> SELECT USER_ID FROM DBA_USERS WHERE USERNAME = 'SYLVAIN';
USER_ID
----------
48
我试图检索
ROWID
列
ROWID
此处无关。这些是行物理存储的“指针”。在某些特定条件下,它们可能会发生变化。由于 views 没有物理存储,ROWID
对他们来说毫无意义 - 因此错误“ORA-01445”:
来自oraerr
的:
ORA-01445:无法从联接中选择ROWID 没有密钥保存表的视图原因:SELECT语句尝试从视图中选择ROWID 派生自联接操作。因为在视图中选择了行 不对应底层物理记录,没有ROWID可以 返回。
操作:从视图选择子句中删除ROWID,然后重新执行 声明。
答案 1 :(得分:0)
Sylvain所说的是rownum
而不是rowid
。 rownum是一个序列号,而rowid表示一行的物理位置。
见这里:
0:opal@spmdtz> select rowid, rownum, xxx.* from xxx;
Rowid |rownum|x |y |
------------------------------------
AAAS/3AAGAAAbmYAAA| 1|foo1|foo2|
AAAS/3AAGAAAbmYAAB| 2|bar1|bar2|
当您想要更新行时,rowid非常有用。您可以说where rowid= ...
或者在其他情况下您想要引用您已经"有"的行。我相信这是访问行的最快方式。
但我不明白你为什么需要查询中的rowid。
答案 2 :(得分:0)
DBA_USERS是一个视图,一个由几个表上的查询组成的视图。
ORA-01445 表示Oracle无法检索您请求的ROWID,因为您需要直接查询相关表 (或更改视图SQL和查询ROWID也可以获得相关的ROWID(不用说,如果你的视图是通过加入几个表来创建的 - Oracle如何确定你想要的ROWID?)。
“主”表DBA_USERS从 sys.USER $ 表中获取数据。
要获取ROWID,首先要查看DBA_USERS背后的SQL(在大多数IDE中非常简单),以了解除ROWID之外要查询的数据。
然后你可以查询:
select ROWID, USER# user_id, NAME username
from sys.USER$;
(或您需要的任何其他列)。
祝你好运!