我正在使用JSP和Oracle开发在线注册系统,我需要为每个成功的注册人提供一个唯一的注册号码。为此,我想采用Oracle的NEXTVAL工具,但我将采取哪种政策进入两难境地。
政策1:首先,我将按以下方式存储序列的NEXTVAL。
select seq_form.nextval slno from dual;
然后我会将slno存储到变量中
int slno;
现在,当用户最终提交表单时,我将在插入查询中使用slno,如
insert into members(registration_no, name,...) values(slno, name, ...);
这里registration_no是主键。
政策2:在我的第二个政策中,我将先运行插入查询
insert into members(registration_no, name,...) values(seq_form.nextval, name, ...);
获取最后插入的ID,如
select seq_form.currval slno from dual;
然后将其保存在某些变量中
int slno;
并使用相同的方式向注册人展示。现在我无法得出一个在安全性和效率方面更好的结论。在这里,我必须明确指出,在这两种情况下,我的意图是在成功提交表格后给用户一个唯一的序号,并且安全性我想说用户应该得到他/她的ID尊重自己的网络会话。请帮帮我。
答案 0 :(得分:2)
我建议你稍微改变一下:
在MEMBERS表上创建BEFORE INSERT触发器。在触发器中将REGISTRATION_NO列设置为SEQ_FORM.NEXTVAL:
CREATE OR REPLACE TRIGGER MEMBERS_BI
BEFORE INSERT ON MEMBERS
FOR EACH ROW
BEGIN
:NEW.REGISTRATION_NO := SEQ_FORM.NEXTVAL;
END MEMBERS_BI;
不要将REGISTRATION_NO放入INSERT语句的列列表中 - 它将由触发器设置,因此无需为其提供任何值:
使用RETURNING子句作为INSERT语句的一部分,以获取触发器放入REGISTRATION_NO的值:
INSERT INTO MEMBERS (NAME, ...)
VALUES ('Fred', ...)
RETURNING REGISTRATION_NO INTO some_parameter
分享并享受。
答案 1 :(得分:1)
如果您使用的是oracle 12,则可以使用identity column。 然后使用RETURNING返回自动生成的值。
答案 2 :(得分:0)
使用策略2.因为您无法始终确保插入查询成功。如果插入失败,则oracle序列已向前滚动,您将丢失序列。
最好先插入并稍后将其提取到变量中。