ORA-02287 | Inserción múltiple en Oracle usando secuencia

Vamos a explicar como insertar varios registros en Oracle en una misma sentencia usando como valor identificador una secuencia.

Previamente antes de usar una secuencia deberemos de crearla en la base de datos:

 CREATE SEQUENCE secuencia_id
  START WITH 1
  INCREMENT BY 1
  maxvalue 5000000
  minvalue 1;

Si creamos una secuencia en Oracle cuando llamemos a dicha secuencia siempre devolverá un valor único.

Lo primero que se suele usar es la instrucción INSERT ALL para insertar varios registros pero pronto comprobaremos como la secuencia no avanza en una misma sentencia y a causa de esto visualizaremos el siguiente error:

Error producido: ORA-02287: sequence number not allowed here (número de secuencia no permitido aquí)

En los siguientes puntos usar secuencias dará errores:

  • En la cláusula de la WHERE
  • En las cláusula GROUP BY o ORDER BY
  • En la cláusula DISTINCT
  • En UNION o INTERSECT o MINUS
  • En una sub-query

Ahora veremos tres casos muy comunes que produce error o funcionamiento incorrectos:

  • Forma Incorrecta:
INSERT ALL
INTO persona(id, nombre, edad) VALUES(secuencia_id.nextval,'Patricia', 26)
INTO persona(id, nombre, edad) VALUES(secuencia_id.nextval, 'Iván', 29)
SELECT * FROM DUAL;
  • Forma Incorrecta: incrementando el valor de la secuencia
INSERT ALL
INTO persona(id, nombre, edad) VALUES(secuencia_id.nextval+0,'Patricia', 26)
INTO persona(id, nombre, edad) VALUES(secuencia_id.nextval+1, 'Iván', 29)
SELECT * FROM DUAL;
  • Forma Incorrecta:
INSERT INTO persona
(id, nombre, edad)
SELECT secuencia_id.nextval,'Patricia', 26 FROM dual
UNION ALL
SELECT secuencia_id.nextval,'Iván', 29 FROM dual;

Solución correcta para inserción múltiple con secuencia

INSERT INTO persona
  (
    id,
    nombre,
    edad
  )
SELECT 
   secuencia_id.nextval, nombre, edad
FROM
  (
     SELECT 
        'Patricia' AS nombre,
        26         AS edad
     FROM dual
     UNION ALL
     SELECT 
      'Iván' AS nombre,
        29   AS edad
  FROM dual
  ) ;

Iván Martínez

Ingeniero Informático apasionado por el mundo del desarrollo WEB. Me gusta caminar por este mundo lleno de tecnologías y día a día aprender cosas nuevas como el doctor Frankenstein ¡dadme cosas para experimentar!

Un comentario sobre “ORA-02287 | Inserción múltiple en Oracle usando secuencia

  • el Feb 19, 2018 a las 5:10 pm
    Permalink

    me ayudó mucho, mis dieses para usted

    Respuesta

Deja un comentario

Tu dirección de correo electrónico no será publicada.