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