【问题标题】:JDBC - Get Sequence CURRVAL after NEXTVAL was used by a TriggerJDBC - 在触发器使用 NEXTVAL 后获取序列 CURRVAL
【发布时间】:2017-06-08 09:33:51
【问题描述】:

我将 Oracle DB V10.2.0.1.0 用于我的项目,并使用 Java 作为服务器。我正在尝试仅通过代码将数据添加到几个表中,但它需要使用相同的序列值。

我有一个序列,它代表T_GROUP 表的ID,名为GROUP_SEQ。 (增量:1,Min_Value:1,Max_Value:999999999999999999999999,缓存大小:20,周期:否,顺序:否)。

一旦我将一个新组输入到数据库中,所述 GROUP_SEQ 就会被触发器递增:

CREATE OR REPLACE TRIGGER GROUP_TRIGGER2
BEFORE INSERT ON T_GROUP for each row
begin
 SELECT GROUP_SEQ.nextval
 INTO :new.ID
 from dual;
END;

在我的代码中,我在代码中执行了addGroup() 函数,该函数成功添加了一个新组以及正确的GROUP_SEQ 值,但是当我尝试获取currval 时它失败了,因为我自己没有使用 nextval,所以我得到了这个异常:

ORA-08002: sequence GROUP_SEQ.currval is not yet defined in this session

即使我确实在触发器中定义了它。如果我通过 SQLplus cmd 运行相同的命令,也会发生同样的情况。

提前致谢!

【问题讨论】:

  • 你违反了甲骨文的第一条诫命,即:“你必须指定你的模式,否则将遭受永恒的诅咒;你的头上会坠落蛇、青蛙和其他爬行动物和两栖动物 - 是的, 即使在你的头上也会落下蟾蜍”。巧合?我认为不是!!!! :-)
  • 你在java服务器中使用连接池吗?
  • @krokodilko 我不确定-在注册驱动程序后,我正在使用单例通过java.sql.DriverManagerDriverManager.getConnection() 函数获得单个连接。我想它确实在后台使用了连接池,但我没有自己创建一个池
  • @krokodilko Brilliant,感谢您的启发

标签: sql oracle jdbc triggers sequence


【解决方案1】:

如果您有数据要插入到多个表中,那么编写一个存储过程来一次性为所有表执行 DML:

CREATE OR REPLACE PROCEDURE add_group(
  in_column_a IN  T_GROUP.COLUMN_A%TYPE,
  in_column_b IN  T_GROUP.COLUMN_B%TYPE,
  out_id      OUT T_GROUP.ID%TYPE
)
AS
BEGIN
  INSERT INTO T_GROUP (
    id,
    column_a,
    column_b
  ) VALUES (
    GROUP_SEQ.NEXTVAL,
    in_column_a,
    in_column_b
  )
  RETURNING id INTO out_id;

  INSERT INTO other_table (
    id
  ) VALUES (
    out_id
  );
END;
/

在几乎所有情况下,您都不需要使用触发器。

【讨论】:

    【解决方案2】:

    解决了!

    问题确实出在我使用的连接上 - 我在某个地方再次使用了getConnection,因此有了不同的会话。

    谢谢@krokodilko

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 1970-01-01
      • 2021-06-11
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多