oracle 获取上一条insert语句的id 插入到当前insert语句中

[size=large]当我执行以下一条sql语句
insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '老爸', 1001);

获取该语句的id时,,假设为1002,那么以下三条sql语句的父节点都为1002,即

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子1', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子2', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子3', 1002);


现在我想用sql语句直接来写上面那三条insert语句,而不是先获得1002后 再执行

请问 怎么搞啊 。。。。。。。。。。。。。。

谢谢![/size]

用一下我这个方法,不用得到中间值1002就能插入:

[code="sql"]
insert into TEST_INFO (ID, NAME, PARENTID) select SEQ_TEST_INFO.NEXTVAL,'儿子1',ID from TEST_INFO where PARENTID=1001;

insert into TEST_INFO (ID, NAME, PARENTID) select SEQ_TEST_INFO.NEXTVAL,'儿子2',ID from TEST_INFO where PARENTID=1001;

insert into TEST_INFO (ID, NAME, PARENTID) select SEQ_TEST_INFO.NEXTVAL,'儿子3',ID from TEST_INFO where PARENTID=1001;
[/code]

上面的就是sql语句啊

[code="sql"]
insert into TEST_INFO (ID, NAME, PARENTID) select SEQ_TEST_INFO.NEXTVAL,'儿子1',ID from TEST_INFO where PARENTID=1001
[/code]

创建一个触发器试试:
[code="java"]create trigger trigger_name after insert on TEST_INFO
for each row
begin
insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子1', :new.ID);
insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子2', :new.ID);
insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '儿子3', :new.ID);
end;[/code]

使用 sequence的 currval属性

[code="sql"]
insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '老爸', 1001);

获取该语句的id时,,假设为1002,那么以下三条sql语句的父节点都为1002,即

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子1', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子2', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子3', 1002);

[/code]

不好意思,没看清楚意思。
[quote]使用 sequence的 currval属性

Sql代码

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.NEXTVAL, '老爸', 1001);

获取该语句的id时,,假设为1002,那么以下三条sql语句的父节点都为1002,即

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子1', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子2', 1002);

insert into TEST_INFO (ID, NAME, PARENTID) values (SEQ_TEST_INFO.currval, '儿子3', 1002); [/quote]

因为涉及到序列号,所以单纯使用sql语句已经很难做到合成一条语句了,可以用触发器或pl/sql编程实现,不过我想这又和你的初衷不相符了,当然还是直接写sql简单一点,目前只能做到一条一条insert into select这样的地步了。

如果没有序列的干扰,可以将几个select子句union一下,这样就就可以实现多条一次插入了!

没有序号干扰情况下一次插入,例子如下:

[code="java"]
insert into TEST_INFO (ID, NAME, PARENTID)
select '1','儿子1',ID from TEST_INFO where PARENTID=1001
union
select '2','儿子2',ID from TEST_INFO where PARENTID=1001
union
select '3','儿子3',ID from TEST_INFO where PARENTID=1001;
[/code]