Обновление и вставка на основе значения элемента Oracle APEX

У меня есть страница APEX, которая обновляет таблицу (SAMPLE_TAB). В этой таблице есть несколько столбцов (ID, BADGEID, USERID, NAME, CITY, ZIP, EFTDT, TERMDT, STATUS) ID - это отдельный номер для записей.

BADGEID и USERID связаны, и если одна из записей будет изменена, она должна автоматически создать новую запись, а срок действия старой записи истечет.

Если есть изменение в NAME, CITY или ZIP, то следует обновить запись.

Например: см. Таблицу ниже

ID BADGEID ИМЯ ПОЛЬЗОВАТЕЛЯ ГОРОД ZIP EFFDT TERMDT STATUS

1 2345 54623 XYZ NY 00000 31.08.2020 31.12.2199 Активно

2 5678 90876 DEF NJ 00001 31.08.2020 31.12.2199 Активно

Если BADGEID 2345 изменен на 2354 для того же USERID (54623) 1 СЕНТЯБРЯ 2020 г., то должна быть новая запись, как показано ниже

3 2354 54623 XYZ NY 00000 01.09.2020 31.12.2199 АКТИВНЫЙ

И обновите старую запись ниже

1 2345 54623 XYZ NY 00000 31.08.2020 09.01.2020 НЕАКТИВНО

Я пробовал под кодом PL / SQL при обработке обновлений, но получаю ошибку

DECLARE ID_PARM = (ВЫБЕРИТЕ ЗНАЧОК ИЗ SAMPLE_TAB, ГДЕ ID =: P1_ID)

НАЧАТЬ ЕСЛИ (: P1_BADGEID = ID_PARM) ТОГДА ОБНОВИТЬ ....... ИНАЧЕ ВСТАВИТЬ и ОБНОВИТЬ


person MHK    schedule 31.08.2020    source источник


Ответы (1)


Полагаю, вы ищете что-то подобное. Заполните ... дополнительными столбцами / элементами / условиями страницы:

DECLARE
  l_old_row sample_tab%ROWTYPE;
BEGIN
  SELECT * INTO l_old_row FROM sample_tab WHERE id = :P1_ID;
  IF ((l_old_row.badge_id != :P1_BADGE_ID) OR (l_old_row.user_id != :P1_USERID))
  THEN
    UPDATE sample_tab SET status = 'INACTIVE' WHERE id = :P1_ID;
    INSERT INTO sample_tab (badgeid,userid,...) VALUES (:P1_BADGE_ID, :P1_USERID,...);
  ELSIF ((l_old_row.name != :P1_NAME) OR (l_old_row.city != :P1_CITY) OR ...) THEN
    UPDATE sample_tab
       SET name = :P1_NAME,
           city = :P1_CITY,
           ...
     WHERE id = :P1_ID;
  END IF;
END;
person Koen Lostrie    schedule 01.09.2020
comment
Я получаю ошибку при выборе SELECT * FROM sample_tab INTO l_old_row WHERE id =: P1_ID; часть с командой SQL не завершена должным образом. - person MHK; 01.09.2020
comment
Изменяет оператор sql на приведенный ниже, и он работал SELECT * INTO l_old_row FROM sample_tab WHERE id =: P1_ID; - person MHK; 01.09.2020
comment
@MHK спасибо, я обновил свой ответ - код не тестировался - person Koen Lostrie; 02.09.2020