Oracle
 sql >> база данни >  >> RDS >> Oracle

задействайте ако друго

Синтаксисът на PL/SQL не позволява включване на SQL изрази в клаузата IF.

Правилният подход е да отделите оператора SELECT и след това да тествате неговия резултат. Така че това би било:

create or replace trigger trig1 
after insert on table_1 
for each row 
declare
    v table2.column2%type;
begin
    select table2.column2 
    into v
    from table2 
    where table2.id= :new.id;

    if v is null
    then 
        update table2 
        set table2.column2 = :new.column1 
        where table2.id = :new.id; 
    end if; 
end trig1;

Имайте предвид, че това не обработва съществуването на множество редове в table2 съответстващи на критериите или наистина няма съответстващи редове. Освен това не се справя със заключването.

Освен това имайте предвид, че код като този не функционира добре в среди с много потребители. Затова споменах заключване. Трябва наистина да използвате процедурна логика, за да се справите с тези видове изисквания. Въпреки че, както често се случва с лошо замислени тригери, истинският виновник е лош модел на данни. table2.column2 е трябвало да се нормализира и не съществува.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите достъп до структурата и да получите списък с колони, типове данни на рекурсора?

  2. Изберете мин. три стойности на запис в друга таблица с JOIN

  3. Как да експортирате данни за полетата на clob в разработчика на oracle sql

  4. Игнорирайте параметъра за период от време в клаузата where, когато параметърът не е въведен

  5. Добавяне на обединени данни към резултат от заявка