从SQL中的序列获取最后一个值并将其插入到另一个表(Oracle)中

我有2个表,它们是通过执行以下命令创build的(请记住,每个查询都是通过node.js执行的,即connection.execute('select ….')):

create table User(userid int not null, name varchar(50) not null, primary key(userid)); create table Random(userid int not null, random int, primary key (userid), foreign key (userid) references User(userid) ); 

我还添加了一个序列来自动递增用户ID:

 create sequence userid_seq; create or replace trigger userid_bir before insert on User for each row begin select userid_seq.nextval into :new.userid from dual; end; / 

现在,我有一个过程,插入一个新的用户后,该用户的ID立即插入到随机。 我通过Stackoverflow浏览并提出:

 insert into User(name) values('John'); SET @last_id = LAST_INSERT_ID(); insert into Random(userid, random) values( last_id, 2); 

但是,我得到以下错误:

 SP2-0735: unknown SET option beginning "@last_id" 

有任何想法吗?

我的另一个担心是,如果有两台计算机试图同时插入两个用户(总计),则last_id值(或MAX用户标识值)可能会混乱。 也就是说,服务器可能正在执行:

 insert into User(name) values('John'); ## from Person A insert into User(name) values('Brian'); ## from Person B SET @last_id = LAST_INSERT_ID(); ## from Person A, say it's set to 1 SET @last_id = LAST_INSERT_ID(); ## from Person B, say it's set to 2 insert into Random(userid, random) values( last_id, 2); ## from Person A insert into Random(userid, random) values( last_id, 2); ## from Person B, error: duplicate values? 

这可能是MySQL的语法。 在Oracle中,您可以使用RETURNING INTO子句。

 declare last_id number; begin insert into user(name) values('Abcd') returning userid into last_id; insert into Random(userid, random) values( last_id, 2); commit; end; / 

userid_seq.currval将返回当前会话中为序列返回的最近值。 所以你可以

 INSERT INTO random( userid, random ) VALUES( user_id_seq.currval, 2 ); 

如果你想有一个局部variables的值

 DECLARE l_userid user.user_id%type; BEGIN INSERT INTO user(name) VALUES( 'John' ) RETURNING userid INTO l_userid; INSERT INTO random( userid, random ) VALUES( l_userid, 2 ); END;