Oracle - 如何获取当前会话中使用的最后一个序列值

时间:2015-05-19 06:18:26

标签: database oracle

我有一个表,其中id列从序列中获取其值。

我正在使用OCI与数据库进行交互。

在向表中插入记录后,我需要获取插入记录时所使用的序列的值(进入我的进程内存),这实际上是为当前会话生成的最新序列值。根据{{​​3}}回答,它应该是可能的。

我发现(function (guess, tryy, message) { var comp = function () { return Math.floor(Math.random() * 6) }; var number = comp(); var count = 0; var test = function () { var val = guess.value; if (!Number.isNaN(val) && val >= 0 && val <= 5) { switch (true) { case val > number: message.innerHTML = 'Your guess was too high!'; count++; break; case val < number: message.innerHTML = 'Your guess was too low!'; count++; break; case val == number: count++; message.innerHTML = 'Congratulations you found the number! It took you ' + count + ' guesses'; //Reseting game here setTimeout(function(){ count = 0; number = comp(); guess.value = ''; message.innerHTML = 'Your game has been reset'; }, 2000); break; }; } }; tryy.onclick = test; guess.onkeyup = function (e) { if (e.keyCode == 13) { test(); } } })(document.getElementById('guess'), document.getElementById('tryy'), document.getElementById('message')); 表可能适合我的目的,但我不确定是否可以使用它,因为它有关于当前用户的序列数据。我需要的是当前会话的序列数据。我有多个使用相同用户ID和密码的并发数据库会话。

4 个答案:

答案 0 :(得分:3)

你可以这样做:

  insert into testtable (ID, ...)
   values (schema.seq_testtable.nextval, ...)
  returning ID into currID;

你可以在这里阅读“返回”条款:

http://psoug.org/snippet/UPDATE-with-RETURNING-clause_604.htm

答案 1 :(得分:1)

您可以使用sequence_name.currval。 Oracle documentation说:

  

将序号用于CURRVAL

     

要使用或引用会话的当前序列值,   引用seq_name.CURRVAL。 CURRVAL只能用于   seq_name.NEXTVAL已在当前用户会话中引用(in   当前或以前的交易)。 CURRVAL可以引用为   必要时多次,包括同一次多次   声明。 NEXTVAL之前不会生成下一个序列号   引用。

答案 2 :(得分:1)

您应该指定您使用的开发环境。如果你使用JAVA,当你遇到问题时,因为JDBC假定DML语句只有输入绑定参数。常见的技巧是将INSERT语句包装到匿名块中并使其成为可调用语句。

begin
 insert into t(id, x) valuse(t_seq.next_val, :x) returning in into :id;
end;

这样的可调用语句将具有一个IN和一个OUT参数。 JDBC 3.0也引入了它自己的方式(getGeneratedKeys()方法),但我不确定它如何与Oracle一起工作。

如果是OCI,它可以开箱即用。如果我在OCI中正确回忆你只是调用OCIBindByName并指定,那么来自returns子句的变量是类型(INOUT)。然后在执行后,您将找到从该绑定变量中的语句返回的ID。它甚至适用于批量插入,即您传递要插入数据库的值的向量,并获得生成ID的向量。

我无法快速找到任何OCI示例。在OTL(OCI包装器lib)的情况下,它在here。我认为任何OCI包装器lib都支持它。另外看一下OCILIB,它的源代码更容易阅读。

答案 3 :(得分:-1)

根据#Stefan的说法,

SEQ_NAME.CURRVAL,但是在这种情况下你有第一次在当前会话中必须有相同序列的NEXTVAL,如果顺序有CACHE你可以使用返回插入ID的#EntGriff选项来变量