【问题标题】:ORA-02287 when inserting sequence value into Oracle tableORA-02287 将序列值插入 Oracle 表时
【发布时间】:2023-03-07 02:44:02
【问题描述】:

这是我的查询:

INSERT INTO MY_TABLE(
    ID,
    FILE,
    URL,
    CREATED_DATE,
    CREATED_BY,
    LAST_MODIFIED_DATE,
    LAST_MODIFIED_BY
) VALUES (
    (SELECT mytable_seq.nextval FROM DUAL), ?, ?, 
    (SELECT NOW() FROM DUAL), ?, (SELECT NOW() FROM DUAL), ?
)

运行此查询时出现此错误:

ORA-02287:此处不允许序列号

发生了什么事?我的背景不是 Oracle,但我还没有看到我记得的 PostgreSQL 的这种行为。我是否不正确地访问序列?

【问题讨论】:

标签: sql oracle


【解决方案1】:

我倾向于使用insert . . . select:

INSERT INTO MY_TABLE(ID, FILE, URL, CREATED_DATE, CREATED_BY, LAST_MODIFIED_DATE,
                     LAST_MODIFIED_BY)
    SELECT mytable_seq.nextval, ?, ?, sysdate, ?, sysdate, ?
    FROM dual;

不过,老实说,我倾向于设置触发器来设置 idcreated_datecreated_bylast_modified_datelast_modified_by。这似乎是确保这些列包含您真正需要的信息的最佳方式。

【讨论】:

    【解决方案2】:

    您不需要SELECT 语句,

    INSERT INTO MY_TABLE(
        ID,
        FILE,
        URL,
        CREATED_DATE,
        CREATED_BY,
        LAST_MODIFIED_DATE,
        LAST_MODIFIED_BY
    ) VALUES (
        mytable_seq.nextval, ?, ?, 
        sysdate, ?, sysdate, ?
    )
    
    • 您可以直接访问序列。
    • 当前日期也一样(在 Oracle 中是 SYSDATE,而不是 NOW())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 2015-02-17
      • 2012-08-09
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多