sql - вставить, если не существует - PullRequest
5 голосов
/ 18 ноября 2011

У меня проблемы с SQL-запросом. Мне нужно вставить строку, если такая же строка еще не существует. Это то, что я до сих пор:

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;

Я не очень хорошо знаком с SQL, особенно с синтаксисом несуществующего, поэтому при выполнении я получаю следующую ошибку:

ORA-06550: строка 37, столбец 11: PLS-00103: Обнаружен символ «INSERT» при ожидании одного из следующих действий:

тогда и или

Символ "then" был заменен на "INSERT" для продолжения.

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

Ответы [ 4 ]

12 голосов
/ 18 ноября 2011

Все это делается в SQL, а не переключение контекста в 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);
2 голосов
/ 19 ноября 2011

Лучшим (специфичным для Oracle?) Решением может быть утверждение MERGE.

См. Здесь хорошее объяснение с примерами:

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

Надеюсь, это поможет.

1 голос
/ 18 ноября 2011

Вы забыли ТО

IF condition THEN  
   ...
ELSE
    ...
END IF;
0 голосов
/ 14 сентября 2017
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...