为什么此查询将null而不是所选字符串添加到表中?

时间:2019-05-28 13:57:43

标签: sql oracle null insert

我正在Oracle SQL中运行以下查询。表有2列,第一列是rowid类型,第二列是varchar。

INSERT INTO MYTABLE SELECT 'AAAAAAAAAAAAAAAAAA' RID, NULL FROM DUAL;

结果是在两列中都添加了空值。

为什么会这样?

'AAAAAAAAAAAAAAAAAA'不能添加到表格的第一列吗?

2 个答案:

答案 0 :(得分:0)

ROWID is a pseudocolumn不会存储,只能选择。因此,您的RID不是行ID。

没有其他详细信息,似乎您使用的是EXTENDED ROWID

  

扩展的rowid存储为以64为基的值,其中可以包含字符A-Z,a-z,0-9,加号(+)和正斜杠(/)。扩展的rowid不能直接使用。您可以使用提供的包DBMS_ROWID来解释扩展的rowid内容。程序包函数提取并提供可直接从受限制的rowid以及扩展的rowid专用的信息中获取的信息。

如文档中所述,您不仅可以简单地选择它,还必须使用DBMS_ROWID来存储或获取它们。

答案 1 :(得分:0)

将'AAAAAAAAAAAAAAAAAAAAA'添加到rowid数据类型列中时,oracle将字符串转换为rowid并将其存储在其中。

select chartorowid('AAAAAAAAAAAAAAAAAA') from dual; -- Result: NULL

“ AAAAAAAAAAAAAAAAAAAAA”行标识不代表任何物理位置。实际上,Oracle使用“ AAAAAAAAAAAAAAAAAA”行标识代表当前正在处理但实际上不存在的行。例如在触发器中(新行)。

考虑到rowid是Oracle使用的特殊rowid,它分配给逻辑上而非物理上存在的所有行。

希望,这就是您要寻找的答案。