在Oracle中使用NEXTVAL和CURRVAL哪种策略更好?

时间:2015-04-06 17:41:23

标签: oracle jsp

我正在使用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尊重自己的网络会话。请帮帮我。

3 个答案:

答案 0 :(得分:2)

我建议你稍微改变一下:

  1. 在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;

  2. 不要将REGISTRATION_NO放入INSERT语句的列列表中 - 它将由触发器设置,因此无需为其提供任何值:

  3. 使用RETURNING子句作为INSERT语句的一部分,以获取触发器放入REGISTRATION_NO的值:

    INSERT INTO MEMBERS (NAME, ...) VALUES ('Fred', ...) RETURNING REGISTRATION_NO INTO some_parameter

  4. 分享并享受。

答案 1 :(得分:1)

如果您使用的是oracle 12,则可以使用identity column。 然后使用RETURNING返回自动生成的值。

答案 2 :(得分:0)

使用策略2.因为您无法始终确保插入查询成功。如果插入失败,则oracle序列已向前滚动,您将丢失序列。

最好先插入并稍后将其提取到变量中。