我正在使用Spring和JDBCTemplate。
场景是CUSTOMER表和ORDERS表 - 父子关系。
我想进行插入(例如1个客户和5个订单) - 但我不确定如何以编程方式在CUSTOMER表中插入一行(有些如何获取Oracle生成的唯一ID),然后插入子表中相应的5行ORDERS,具有客户插入创建的唯一ID。这种独特的ID显然维持了客户与订单之间的关系。
任何帮助都非常感激。
PS - 关于如何在Spring Framework中完成此操作的示例SQL的代码将是非常棒的 - 只是为了给我一个基本的想法。
答案 0 :(得分:5)
答案 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,而不是让数据库自动创建它。
与上述建议类似,不同之处在于,如果有人在您插入所有订单之前插入了另一位客户,那么您最终会在错误的客户下找到这些订单。