【问题标题】:Why is this query adding null to the table instead of the selected string?为什么此查询向表中添加 null 而不是选定的字符串?
【发布时间】:2019-05-28 13:57:42
【问题描述】:

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

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

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

为什么会这样?

不应该将“AAAAAAAAAAAAAAAAAA”添加到表格的第一列吗?

【问题讨论】:

  • 您为什么要在rowid 类型的列中插入常量值?那应该是数据库地址。
  • 好吧,ROWID 类型不是文本列,as this SO question discusses。与其解释为什么你做错了,也许首先要问的是你为什么要在ROWID 列中插入文本?
  • 你能张贴表格结构吗?看来你在那一栏中没有接受'AAAAAAAAAAAAAAA'的东西
  • 插入查询正在工作,如果我们将“AAAAAAAAAAAAAAAAAA”更改为“AAAAAAAAAAAAAAAAAAAAB”。可能和rowid值的有效性有关,可以使用dbms_rowid.rowid_info来检查。

标签: sql oracle null insert


【解决方案1】:

当您将 'AAAAAAAAAAAAAAAAAA' 添加到 rowid 数据类型列时,oracle 会将字符串转换为 rowid 并将其存储在那里。

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

'AAAAAAAAAAAAAAAAAA' rowid 不代表任何物理位置。事实上,Oracle 使用 'AAAAAAAAAAAAAAAAAA' rowid 来表示当前正在处理但物理上不存在的行。例如在触发器中(新行)。

将提到的 rowid 视为 Oracle 使用的特殊 rowid,它分配给逻辑上存在的所有行,而不是物理上。

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

【讨论】:

    【解决方案2】:

    ROWID is a pseudocolumn 不存储,只能选择。所以你的 RID 不是行 ID。

    没有任何其他细节,您似乎正在使用EXTENDED ROWID

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多