2011-12-03 14 views
8

Estoy tratando de insertar 40 filas usando INSERT ALL INTO y no estoy seguro de cómo insertar la clave sustituta. Esto es lo que tengoINSERT ALL INTO y Sequence.nextval para una clave sustituta

BEGIN 
    INSERT ALL 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 
END 

Ahora, si agrego otro INTO VALUES, aparece una violación de restricción única.

BEGIN 
    INSERT ALL 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 

    INTO question(question_id) 
    VALUES (question_seq.nextval) 
END 

¿Cómo puedo actualizar las secuencias de valor para cada nextval en valores para que pueda evitar la violación de restricción único? Supuse que nextval se actualizaría automáticamente.

ACTUALIZACIÓN: No sé si esta es la mejor manera de manejar esto, pero aquí está la solución que se me ocurrió:

primero creé una función que devuelve un valor entonces me llamaron esa función en el campo ID de la cláusula VALORES

create or replace 
FUNCTION GET_QUESTION_ID RETURN NUMBER AS 
num NUMBER; 
BEGIN 
    SELECT UHCL_QUESTIONS_SEQ.nextval 
    INTO num 
    FROM dual; 
    return num; 
END GET_QUESTION_ID; 

INSERT ALL 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
+1

¿No necesita una cláusula 'from' con su' insert all'? – Raihan

+0

@Raihan no para insertar todo. – Robert

+0

@Raihan perdón por eso ... tienes razón, simplemente no pegué la selección, pero tengo una. – Robert

Respuesta

0

Puede usar algo como esto:

insert into question(question_id) 
select question_seq.nextval from 
(
    select level from dual connect by level <= 40 
); 

Aunque no es un formato muy conveniente, especialmente si hay otras columnas que quieras agregar Probablemente necesite crear otra consulta UNION ALL y unirla por LEVEL o ROWNUM.

Mi primera idea era hacer algo como esto:

insert into question(question_id) 
select question_seq.nextval value from dual 
union all 
select question_seq.nextval from dual; 

pero genera ORA-02287: sequence number not allowed here, debido a la restrictions on sequence values.


Por cierto, ¿está seguro de sus obras sin INSERT ALL una subconsulta? Me sale el error ORA-00928: missing SELECT keyword, y el diagrama del 11,2 manual implica que debe haber una subconsulta:

enter image description here

0

no sé si esta es la mejor manera de manejar esto, pero aquí está la solución que se me ocurrió:

primero creé una función que devuelve un valor Me llamó entonces esa función en el campo ID de la cláusula VALORES

create or replace 
FUNCTION GET_QUESTION_ID RETURN NUMBER AS 
num NUMBER; 
BEGIN 
    SELECT UHCL_QUESTIONS_SEQ.nextval 
    INTO num 
    FROM dual; 
    return num; 
END GET_QUESTION_ID; 

INSERT ALL 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
INTO question(question_id) 
VALUES (GET_QUESTION_ID()) 
1

Siendo de un fondo de SQL Server, siempre me he creado un activador en la tabla de emular básicamente IDENTIDAD funcionalidad. Una vez que el activador está activado, el SK se genera automáticamente a partir de la secuencia al igual que la identidad y no tiene que preocuparse por ello.

Cuestiones relacionadas