2015-03-09 6 views
-1

Я хочу добавить новую запись в свою базу данных Oracle и обновить ее, если она уже существует.Предложение If-else в базе данных Oracle

Я использую предложение If-else для достижения этого.

Ниже мой код:

DECLARE 
    any_rows_found number; 
BEGIN 
    select count(*) 
    into any_rows_found 
    from reports 
    where report_id=27; 
    IF(any_rows_found > 1) 
    THEN 
    UPDATE reports set 
     TITLE = 'Check user entered keywords have valid resource link', 
     CATEGORY = 'zData checks', 
     DISPLAY_ORDER= 9120, 
     QUERY ='...', 
     CONTENT_SEQ=1, 
     DELD=0, 
     ADMIN_ID=1, 
     DATE_UPD = to_timestamp('05-FEB-15 01.44.53.753311000 PM','DD-MON-RR HH.MI.SS.FF AM') 
     WHERE REPORT_ID = 27; 
    ELSE 
    INSERT INTO reports (REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUERY,DESCRIPTION,CONTENT_SEQ,DELD,ADMIN_ID,DATE_UPD) 
VALUES (27, 
     'Check user entered keywords have valid resource link', 
     'zData checks', 
     9120, 
     '...', 
     1, 
     0, 
     1, 
     to_timestamp('05-FEB-15 01.44.53.753311000 PM','DD-MON-RR HH.MI.SS.FF AM')); 
    END IF; 

Это проливает следующее сообщение об ошибке, как видно:

PLS-00103: Столкнутые символ "конец файла", когда ожидает один из нижеследующий:

(начало дела объявить конец исключение выход для goto if loop mod null прагма поднять возврат выбрать обновление с < < продолжает закрывать текущие удаления выборки блокировки вставки открытого множества Отката точки сохранения SQL выполнить обязательство FORALL слияния продувки труб 06550. 00000 - "линия% s, столбец% S: \ п% s" * Причина: обычно PL/Ошибка компиляции SQL.

Где я иду не так? Пожалуйста помоги.

спасибо.

+0

Вы пропускаете 'конец,' в конце. –

ответ

3

Необходимо добавить КОНЕЦ; как последнюю строку файла, чтобы закрыть BEGIN в верхней части.

1

В вашем коде есть КОНЕЦ; отсутствует, чтобы закрыть открытый оператор BEGIN.

Однако, возможно, было бы более интересно переписать свой код в оператор слияния, который также существует в oracle.

Для получения дополнительной информации об этом см. Следующие link.

1

Вы просто пропустите «конец»; в конце файла.

Но я должен сказать: вы также должны взглянуть на слияние SQL DML Statment. Его выполняет именно то, что вам нужно, и непосредственно реализуется от разработчиков СУБД, поэтому мы можем предложить, чтобы он превосходил сценарии PL/SQL самостоятельно.

Для вашего скрипта будет:

MERGE INTO REPORTS old USING (select report_id = 27, 
    TITLE = 'Check user entered keywords have valid resource link', 
      CATEGORY = 'zData checks', 
      DISPLAY_ORDER= 9120, 
      QUERY ='...', 
      CONTENT_SEQ=1, 
      DELD=0, 
      ADMIN_ID=1, 
      DATE_UPD = to_timestamp('05-FEB-15 01.44.53.753311000 PM','DD-MON-RR HH.MI.SS.FF AM') FROM DUAL) new 
ON (old.report_id = new.report_id) 
    when matched then update set 
    old.TITEL = new.TITLE, 
    old.CATEGORY = new.CATEGORY, 
    old.DISPLAY_ORDER = new.DISPLAY_ORDER, 
    old.QUERY = new.QUERY, 
    old.CONTENT_SEQ = new.CONTENT_SEQ, 
    old.DELD = new.DELD, 
    old.ADMIN_ID = new.ADMIN_ID, 
    old.DATE_UPD = new.DATE_UPD 
    when not matched then 
    insert (report_id, TITLE, CATEGORY, DISPLAY_ORDER, QUERY, CONTENT_SEQ, DELD, ADMIN_ID, DATE_UPD) values (new.report_id, new.TITLE, new.CATEGORY, new.DISPLAY_ORDER, new.QUERY, new.CONTENT_SEQ, new.DELD, new.ADMIN_ID, new.DATE_UPD) 
Смежные вопросы