JDBC - 触发器使用NEXTVAL后获取序列CURRVAL

时间:2017-01-23 19:02:23

标签: sql oracle jdbc triggers sequence

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

我有一个序列,代表T_GROUP表的名为GROUP_SEQ的ID。 (递增: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值,但是当我尝试获取{ {1}}它失败了,因为我没有在它上面使用nextval,我得到了这个例外:

currval

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

解决了!

问题确实是我正在使用的连接 - 有一个地方我再次使用var data = { "cars": [{ "id": "1", "name": "name 1", "thsub": [{ "id": "11", "name": "sub 1", "stats": { "items": 5, }, "ions": null }, { "id": "22", "name": "sub 2", "stats": { "items": 5, }, "translations": null }], "image": null }, { "id": "2", "name": "name 2", "thsub": null, //this will break the code "image": null } ] } var thCount = []; for (var l = 0, m = data.cars.length; l < m; l++) { thCount[l] = 0; for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) { if (data.cars[l].thsub[i].stats) { thCount[l]+=data.cars[l].thsub[i].stats.items; } } } console.log(thCount); ,因此有不同的会话。

谢谢@krokodilko

答案 1 :(得分:0)

如果您要将数据插入多个表中,那么编写一个存储过程,一次性为所有表执行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;
/

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