我正试图从DBA_USERS中检索一个USER id,就像我们在DBA_ROLES中可以做的那样。
我试着从DBA_ROLES中检索ROWID列,但我收到了警告:
"ORA-01445:如果没有密钥保留表,就无法从联接视图中选择ROWID或对其进行采样"
据我所知,DBA_USERS是Oracle生成的视图,不可能检索到这个ROWID。我说得对吗?
如果这是正确的,我如何知道这个视图是从哪些表生成的?或者我怎样才能知道用户的ROWID?
谨致问候!
Sam
我正在尝试从DBA_USERS 检索用户id
您正在寻找DBA_USERS.USER_ID
:
SQL> SELECT USER_ID FROM DBA_USERS WHERE USERNAME = 'SYLVAIN';
USER_ID
----------
48
我试着检索
ROWID
列
ROWID
与此无关。这些是指向行物理存储的"指针"。在某些特定条件下,它们可能会发生变化。由于视图没有物理存储,ROWID
对它们来说毫无意义——因此出现错误"ORA-01445":
来自
oraerr
:
ORA-01445:无法从加入中选择ROWID没有密钥保留表的视图原因:SELECT语句试图从视图中选择ROWID派生自联接操作。因为视图中选定的行与底层物理记录不对应,没有ROWID可以返回。
操作:从视图选择子句中删除ROWID,然后重新执行声明。
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。
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$;
(或您需要的任何其他栏)。
祝你好运!