2008-10-01 5 views
6

Con SQLServer, parece generalmente aceptado que agregar un SELECT SCOPE_IDENTITY() al final de su inserción es la mejor manera de devolver el PK del registro recién insertado, suponiendo que está usando un campo de incremento automático para el pk.Mejores prácticas: .NET: ¿cómo devolver PK en una base de datos Oracle?

Sin embargo, parece que no puedo encontrar el equivalente para Oracle.

La mejor práctica parece ser usar una secuencia para generar el PK, pero existen diferentes opciones para implementarlo. ¿Dejas que el desarrollador inserte sequence.nexval o uses un disparador?

En cualquier caso, recuperar la nueva ID parece ser un problema común.

Sugerencias y soluciones que he correr a través incluyen:

  • crear un procedimiento almacenado que devuelve el PK
  • la ejecución de un selecto Identificación de seq.nextval, pasando entonces a que el inserto
  • seleccione max (id) después de la inserción (Nota: no haga esto)
  • añadir una cláusula de regresar a la inserción

lo que debería t la solución de "mejores prácticas" para esta situación?

Respuesta

9

Puede usar la cláusula RETURNING para hacer esto en los procesos almacenados de Oracle.

Por ejemplo:

TABLEA tiene el nombre y EMP_ID. EMP_ID se llena internamente cuando se insertan registros.

INSERTAR EN TABLEA (NOMBRE) VALORES ('BOB') VOLVER A EMP_ID EN o_EMP_ID;

Eso supone que la línea está en un proceso almacenado con un parámetro de salida de o_EMP_ID.

Espero que ayude ... si no, aquí hay un ejemplo más detallado:

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

+1

Para cualquiera que lea esto ahora, el enlace está muerto =/ – Travis

+1

Gracias por notar eso, he cambiado el enlace a algo más estable (si es un poco menos amigable - los documentos de Oracle en la cláusula RETURNING) – ScottCher

4

La cláusula de RETORNO está diseñada solo para este tipo de uso, por lo que yo llamaría una buena práctica usarla.

Una alternativa sería seleccionar seq.CURRVAL después de la inserción. Eso devuelve el último valor obtenido de la secuencia por esta sesión.

+0

Pero tenga cuidado en caso de que una llamada simultánea haya incrementado la secuencia, ¿no? – Liam

+0

No, CURRVAL es el último valor obtenido de la secuencia por ESTA sesión. –

+0

Con Java: seleccione el sequence.nextval antes de la inserción, y establezca el valor en su declaración SQL y no use un disparador en la tabla antes de una inserción. Esto se debe a que en Java RETURN_GENERATED_KEYS no está implementado en PreparedStatement para el controlador Oracle JDBC. – JeeBee

2

El procedimiento almacenado y la cláusula de regresar tienen la ventaja distinta de una sola base de datos llamar a cualquier otra solución es inferior. Si lo haces a través de un procedimiento almacenado o usas una cláusula de retorno es una lata de gusanos en sí misma.

Cuestiones relacionadas