正在获取DBA_USERS信息



我正试图从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$;

(或您需要的任何其他栏)。

祝你好运!

相关内容

  • 没有找到相关文章

最新更新