以编程方式插入行(父级和子级)

时间:2009-02-05 10:15:23

标签: java sql oracle spring

我正在使用Spring和JDBCTemplate。

场景是CUSTOMER表和ORDERS表 - 父子关系。

我想进行插入(例如1个客户和5个订单) - 但我不确定如何以编程方式在CUSTOMER表中插入一行(有些如何获取Oracle生成的唯一ID),然后插入子表中相应的5行ORDERS,具有客户插入创建的唯一ID。这种独特的ID显然维持了客户与订单之间的关系。

任何帮助都非常感激。

PS - 关于如何在Spring Framework中完成此操作的示例SQL的代码将是非常棒的 - 只是为了给我一个基本的想法。

4 个答案:

答案 0 :(得分:5)

检查JDBCTemplate中的update方法,该方法采用KeyHolder对象。执行后,Keyholder对象包含生成的密钥。

Spring文档中有一个使用示例here

答案 1 :(得分:1)

DECLARE
  newid INTEGER;
BEGIN

  INSERT
    INTO customer (name)
  VALUES ('John Doe')
  RETURNING id
  INTO newid;

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order1');

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order2');

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order3');

END;

答案 2 :(得分:1)

我对JDBC或Spring一无所知,但Quassnoi给了你一种Oracle方法。

但是如果您的框架不知道如何使用RETURNING子句......您可以使用序列的currval属性。

SEQUENCE.Currval是一个会话本地“变量”,它包含会话从序列中获取的最后一个值。

BEGIN

  INSERT
    INTO customer (ID, name)
  VALUES (cust_seq.nextval, 'John Doe');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order1');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order2');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order3');

END;

答案 3 :(得分:0)

另一种方法是使用序列来生成ID:

SELECT seq.nextval FROM DUAL - >变成一个变量

然后使用此数字作为您的唯一ID,而不是让数据库自动创建它。

与上述建议类似,不同之处在于,如果有人在您插入所有订单之前插入了另一位客户,那么您最终会在错误的客户下找到这些订单。