referenced - Mejores prácticas:.NET: ¿cómo devolver PK en una base de datos Oracle?
oracle find constraint references (3)
Con SQLServer, parece ser 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 .
Sin embargo, parece que no puedo encontrar el equivalente para Oracle.
La mejor práctica parece ser utilizar 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.
Las sugerencias y soluciones que he encontrado incluyen:
- creando un proceso almacenado que devuelve el PK
- ejecutando una identificación de selección de seq.nextval, luego pasando eso a la inserción
- seleccione max (id) después de la inserción (Nota: ¡No haga esto!)
- agregue una cláusula de RETORNO a la inserción
¿Cuál debería ser la solución de "mejores prácticas" para esta situación?
El procedimiento almacenado y la cláusula de retorno tienen el beneficio distintivo de una sola llamada de base de datos, 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.
La cláusula RETURNING está pensada solo para este tipo de uso, por lo que yo diría que es una buena práctica usarla.
Una alternativa sería seleccionar seq.CURRVAL después del inserto. Eso devuelve el último valor obtenido de la secuencia en esta sesión.
Puede usar la cláusula RETURNING para hacer esto en los procesos almacenados de Oracle.
Por ejemplo:
TABLEA tiene NAME y EMP_ID. EMP_ID se llena internamente cuando se insertan registros.
INSERTAR EN TABLEA (NAME) VALUES (''BOB'') DEVOLVER 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