【问题标题】:Oracle INSERT: Column Value equal to Sequence Number's Nextval generated in another columnOracle INSERT:列值等于在另一列中生成的序列号的 Nextval
【发布时间】:2013-07-08 10:07:45
【问题描述】:

我想在单个表中插入一行,其中一列的值与同一 INSERT 语句中另一列的序列 nextval 生成的值相同:

INSERT INTO PRO.GTRANS_DEFS(IN_USER, GTRANS_NUM, SAME_VALUE) 
VALUES('JOHNT',SQ_GTRANS_NUM.nextval,XXX);

即如何替换 XXX 以便 INSERT 将导致 SAME_VALUE 采用与 SQ_GTRANS_NUM.nextvalGTRANS_NUM 生成的值相同的值?

已尝试引用另一列“GTRANS_NUM”代替 XXX,但不允许 (Oracle 8i)。

【问题讨论】:

    标签: oracle plsql sequence sql-insert


    【解决方案1】:

    不确定行为,但可能值得尝试:

    INSERT INTO PRO.GTRANS_DEFS(IN_USER, GTRANS_NUM, SAME_VALUE) 
    VALUES('JOHNT',SQ_GTRANS_NUM.nextval,SQ_GTRANS_NUM.CURRVAL);
    

    【讨论】:

    • 再次引用nextval 也可以,因为每个语句的序列只会增加一次,但currval 是更好的模式,因为它也可以在同一会话中的语句之间工作。
    • 使用 CURRVAL 可以明确意图,而两次 NEXTVAL 调用可能会让人绊倒。
    • 感谢您确认我的回答 :-) 我不确定我的预言机是否有点生疏,如果 curval 在与 nextval 相同的语句中将具有正确的值或“旧”值:- )
    • @AlexPoole:这是在 Oracle 文档中的某处提到的,还是只是一种未指定的行为?我可以依靠它在未来的 Oracle 版本中工作吗?
    • @blerontin - It's talked about here:“在包含对 NEXTVAL 的引用的单个 SQL 语句中,Oracle 将序列递增一次......对于每一行......”,对于这个特定的例子来说更相关, 项目符号列表后的两段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多