Tengo problemas con una consulta sql. Necesito insertar una fila si la misma fila ya no existe. Esto es lo que tengo hasta ahora:sql - inserte si no existe
DECLARE
BEGIN
FOR FOLDER_ROW IN (SELECT FOLDERID, USERID FROM DATA1.FOLDERS)
LOOP
IF NOT EXISTS (SELECT * FROM DATA1.FOLDER_USER WHERE FOLDER_ID = FOLDER_ROW.FOLDERID AND USER_ID = FOLDER_ROW.USERID)
INSERT INTO DATA1.FOLDER_USER (FOLDER_ID, USER_ID) VALUES (FOLDER_ROW.FOLDERID, FOLDER_ROW.USERID);
END LOOP;
COMMIT;
END;
yo no estaría muy familiarizado con SQL en particular el no existe la sintaxis de modo que cuando ejecuto me sale el siguiente error:
ORA-06550: line 37, column 11: PLS-00103: Encountered the symbol "INSERT" when expecting one of the following:
then and or
El símbolo "y luego" fue sustituido por "INSERT" para continuar.
ORA-06550: line 38, column 10: PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: if ORA-06550: line 40, column 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: end not pragma final instantiable order overriding static member constructor map
++ 1 'IF EXISTS() ... INSERT' normalmente no es atómico, lo que significa que se podría insertar un registro conflictivo entre el control de existencia y el inserto. –
@M_M: una declaración de SQL en Oracle siempre es atómica. Si no hay un índice único, puede terminar con conflictos porque otra sesión insertada no vio la fila porque la primera sesión aún no la había comprometido. –
No puedo hablar sobre el comportamiento de Oracle aquí, pero tomaré su palabra al respecto. Sé que algunos DBMS tratan 'IF EXISTS (...) THEN' y' INSERT INTO' como dos declaraciones, no una, sino que también depende de los niveles de aislamiento de la transacción y similares. –