2008-10-01 88 views
6

对于SQLServer,似乎普遍认为将SELECT SCOPE_IDENTITY()添加到插入的末尾是返回新插入记录的PK的最佳方法,假设您使用自动增量字段派克。最佳实践:.NET:如何针对Oracle数据库返回PK?

但是,我似乎无法找到Oracle的等价物。

最佳实践似乎是使用一个序列来生成PK,但即使如此也有不同的选择。您是否将其留给开发人员以插入sequence.nexval或使用触发器?

在任何一种情况下,获取新ID似乎都是一个常见问题。

建议和解决方案我已经跨越运行包括:

  • 创建一个存储过程返回的PK
  • 运行从seq.nextval一个选择ID,然后传递一个到插入
  • 选择MAX(ID)插入后(注:不要做)
  • 回来的条款添加到insert

我应该ŧ他的“最佳实践”解决方案适用于这种情况吗?

回答

9

您可以使用RETURNING子句在Oracle存储过程中执行此操作。

例如:

TABLEA具有NAME和EMP_ID。当插入记录时,EMP_ID在内部被填充。

INSERT INTO TABLEA(NAME)VALUES('BOB')RETURNING EMP_ID INTO o_EMP_ID;

这是假设该行在存储过程中的输出参数为o_EMP_ID。

希望帮助......如果没有,这里有一个更详细的例子:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

4

RETURNING子句仅用于这种用法,所以我将其称为使用它的最佳实践。

另一种方法是在插入后选择seq.CURRVAL。这返回从这个会话序列中获得的最后一个值。

+0

但是,如果并发呼叫增加了序列,请注意,对吗? – Liam 2008-10-01 16:51:47

+0

不,CURRVAL是从THIS会话序列中获得的最后一个值。 – 2008-10-01 16:53:55

2

存储过程和返回的条款有一个单独的数据库的不同利益传召任何其他的解决办法是逊色。无论你是通过存储过程来实现还是使用返回子句,它本身就是一整套蠕虫。