最佳实践:.NET:如何针对oracle数据库返回PK?

时间:2008-10-01 16:43:21

标签: .net oracle

使用SQLServer,似乎普遍认为在插入的末尾添加SELECT SCOPE_IDENTITY()是返回新插入记录的PK的最佳方法,假设您使用的是自动增量字段对于PK。

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

最佳做法似乎是使用序列来生成PK,但是如何实现甚至可以有不同的选项。您是否将其留给开发人员插入sequence.nexval,或使用触发器?

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

我遇到的建议和解决方案包括:

  • 创建一个返回PK的存储过程
  • 从seq.nextval运行select id,然后将其传递给insert
  • 插入后选择max(id)(注意:不要这样做!)
  • 向插入
  • 添加RETURNING子句

对于这种情况,“最佳实践”解决方案应该是什么?

3 个答案:

答案 0 :(得分:9)

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

例如:

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

INSERT INTO TABLEA(NAME)VALUES('BOB')将EMP_ID归还给o_EMP_ID;

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

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

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

答案 1 :(得分:4)

RETURNING子句仅用于此类用法,因此我将其称为最佳实践。

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

答案 2 :(得分:2)

存储过程和返回子句具有单个数据库调用的独特优点,任何其他解决方案都是劣等的。无论您是通过存储过程来执行还是使用返回子句,本身就是一整套蠕虫。