Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle-如何获取当前会话中使用的最后一个序列值_Database_Oracle - Fatal编程技术网

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

Database Oracle-如何获取当前会话中使用的最后一个序列值,database,oracle,Database,Oracle,我有一个表,其中id列从序列中获取其值 我正在使用OCI与数据库交互 在将记录插入到表中之后,我需要获得插入记录(插入到进程内存中)时使用的序列值,它实际上是为当前会话生成的最新序列值。根据答案,这应该是可能的 我发现USER\u SEQUENCES表可能适合我的目的,但我不确定是否可以使用它,因为它有关于当前用户的序列数据。我需要的是当前会话的序列数据。我有多个使用相同用户id和密码的并发数据库会话。您可以使用sequence\u name.currval。甲骨文说: 将序列号与CURRVAL

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

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

在将记录插入到表中之后,我需要获得插入记录(插入到进程内存中)时使用的序列值,它实际上是为当前会话生成的最新序列值。根据答案,这应该是可能的


我发现
USER\u SEQUENCES
表可能适合我的目的,但我不确定是否可以使用它,因为它有关于当前用户的序列数据。我需要的是当前会话的序列数据。我有多个使用相同用户id和密码的并发数据库会话。

您可以使用sequence\u name.currval。甲骨文说:

将序列号与CURRVAL一起使用

要使用或引用会话的当前序列值, 参考seq_name.CURRVAL。CURRVAL只能在以下情况下使用: seq_name.NEXTVAL已在当前用户会话中引用(在 当前或以前的事务)。CURRVAL可以被引用为 根据需要多次,包括在同一时间内多次 陈述下一个序列号直到NEXTVAL生成后才生成 参考


您可以使用sequence_name.currval。甲骨文说:

将序列号与CURRVAL一起使用

要使用或引用会话的当前序列值, 参考seq_name.CURRVAL。CURRVAL只能在以下情况下使用: seq_name.NEXTVAL已在当前用户会话中引用(在 当前或以前的事务)。CURRVAL可以被引用为 根据需要多次,包括在同一时间内多次 陈述下一个序列号直到NEXTVAL生成后才生成 参考


你可以这样做:

  insert into testtable (ID, ...)
   values (schema.seq_testtable.nextval, ...)
  returning ID into currID;
您可以在此处阅读“退回”条款:


您可以这样做:

  insert into testtable (ID, ...)
   values (schema.seq_testtable.nextval, ...)
  returning ID into currID;
您可以在此处阅读“退回”条款:


根据Stefan所说的SEQ#u NAME.CURRVAL,但在这种情况下,您第一次必须在当前会话中为相同的序列使用NEXTVAL,如果按顺序使用缓存,您可以使用#EntGriff选项将插入的ID返回到变量。

根据Stefan所说的SEQ#u NAME.CURRVAL,但在这种情况下,您有第一次必须在当前会话中为同一序列使用NEXTVAL,如果按顺序使用缓存,您可以使用#EntGriff选项将插入的ID返回到变量。

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

begin
 insert into t(id, x) valuse(t_seq.next_val, :x) returning in into :id;
end;
这样的可调用语句将有一个IN和一个OUT参数。JDBC3.0也引入了它自己的方法(getGeneratedKeys()方法),但我不确定它如何与Oracle一起工作

对于OCI,它是开箱即用的。如果我在OCI中回忆正确,您只需调用OCIBindByName并指定,returning子句中的变量类型为(INOUT)。然后在执行之后,您将在绑定变量中找到从语句返回的ID。它甚至可以与批量插入一起工作,也就是说,您将要插入DB的值的向量传递给DB,然后生成ID的向量


我不能很快找到任何刑事调查处的例子。对于OTL(OCI包装库),它就在这里。我认为任何OCI包装库都支持它。还可以看看OCILIB,它的源代码更容易阅读。

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

begin
 insert into t(id, x) valuse(t_seq.next_val, :x) returning in into :id;
end;
这样的可调用语句将有一个IN和一个OUT参数。JDBC3.0也引入了它自己的方法(getGeneratedKeys()方法),但我不确定它如何与Oracle一起工作

对于OCI,它是开箱即用的。如果我在OCI中回忆正确,您只需调用OCIBindByName并指定,returning子句中的变量类型为(INOUT)。然后在执行之后,您将在绑定变量中找到从语句返回的ID。它甚至可以与批量插入一起工作,也就是说,您将要插入DB的值的向量传递给DB,然后生成ID的向量


我不能很快找到任何刑事调查处的例子。对于OTL(OCI包装库),它就在这里。我认为任何OCI包装库都支持它。另请看OCILIB,它的源代码更易于阅读。

谢谢您的回答。有没有办法把这个值取出来而不是用在其他SQL中?最好不使用
返回
子句?@lahiruchanima:是的,通过上述
currval
函数。请为您的用例指定更多详细信息。谢谢您的回答。有没有办法把这个值取出来而不是用在其他SQL中?最好不使用
returning
子句?@lahiruchanima:是的,通过上述
currval
函数。请为您的用例指定更多详细信息。注意
returning
只能在PL/SQL内部使用,它不能在普通SQL中使用。@horse\u with\u no\u name returning子句也适用于OCI,在PRO*C中也适用。AFAIK它适用于除JDBC之外的所有地方。@ibre5041您能提供一个链接到如何使用OCI执行此操作的示例吗?您可以看到“OCI和returning”这里的示例:@ibre5041感谢您的回复注意,
returning
只能在PL/SQL内部使用,它不能在普通SQL中使用。@a_horse_with_no_name returning子句也适用于OCI和PRO*C。AFAIK它在除JDBC之外的任何地方都适用。@ibre5041您能提供一个链接到如何使用OCI的示例吗?您可以在这里看到“OCI和returning”示例:@ibre5041谢谢您的回复