sql >> Base de Datos >  >> RDS >> Oracle

Insertar varias filas con secuencia en Oracle

Las restricciones en las inserciones de varias tablas incluyen:

  • No puede especificar una secuencia en ninguna parte de una declaración de inserción de tablas múltiples. Una inserción de varias tablas se considera una sola instrucción SQL. Por lo tanto, la primera referencia a NEXTVAL genera el siguiente número y todas las referencias posteriores en la declaración devuelven el mismo número.

Eso no es del todo cierto:puede usar una secuencia, solo que siempre obtiene el mismo valor, por lo que puede ser útil crear registros primarios y secundarios de una sola vez haciendo referencia a la misma secuencia.

Si desea continuar usando insert all usted podría solucione eso usando una función no determinista que obtiene el valor de la secuencia:

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

Pero eso es un poco incómodo. Probablemente sea mejor que use instrucciones de inserción individuales; de todos modos, usar una inserción de varias tablas en una sola tabla no le está ganando mucho, o un disparador para establecer la columna única de la secuencia, o una CTE/vista en línea para generar los valores para insertar.