Pregunta sql - inserte si no existe


Estoy teniendo problemas con una consulta de SQL. Necesito insertar una fila si la misma fila ya no existe. Esto es lo que tengo hasta ahora:

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;

No estaría muy familiarizado con sql, particularmente la sintaxis de no existir, de modo que cuando ejecuto recibo el siguiente error:

ORA-06550: línea 37, columna 11: PLS-00103: Encontró el símbolo   "INSERTAR" cuando se espera uno de los siguientes:

entonces yo

El símbolo "luego" fue sustituido por "INSERTAR" 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

5
2017-11-18 16:01


origen


Respuestas:


Hazlo todo en SQL en lugar de cambiar de contexto a PL / SQL:

INSERT INTO DATA1.FOLDERS
(folder_id,
 user_id)
SELECT f1.folder_id,
       f1.user_id
  FROM DATA1.FOLDERS f1
 WHERE NOT EXISTS (SELECT 1
                     FROM DATA1.FOLDERS f2
                    WHERE f1.folder_id = f2.folder_id
                      AND f1.user_id = f2.user_id);

12
2017-11-18 16:07



Una mejor solución (¿específica de Oracle?) Puede ser la declaración MERGE.

Vea aquí para una buena explicación, con ejemplos:

http://www.oracle-base.com/articles/10g/MergeEnhancements10g.php

Espero que ayude.


2
2017-11-18 21:01



Olvidaste el ENTONCES

IF condition THEN  
   ...
ELSE
    ...
END IF;

1
2017-11-18 16:07



DECLARE
    N_COUNTS NUMBER;
BEGIN
    select count(ID) into N_COUNTS from TABLE_NAME where ID = 1;
    IF N_COUNTS=0 THEN
        INSERT QUERY....
    ELSE
        UPDATE QUERY....
    END IF;
END;

0
2017-09-14 09:14