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

курсор в тригер

Заради цикъла (в който липсва клауза за изход - да се надяваме, че току-що сте го загубили, превръщайки това във въпрос) ще се опитате да вмъкнете запис в pstn_matrix за всеки запишете връщането на курсора, дали има съответстващи :new.person_id или не; и ако има съвпадение, ще направите и update . Което вероятно не е това, което искате, и може да получите нарушение на ограничението, наред с други неща. Вие също не настройвате своето поле за брояч - ако това не е nullable, това ще доведе до грешка. Но не сте казали какви грешки, ако има такива, получавате.

Ако трябва да направите това чрез тригер, можете или да проверите дали изобщо има ред за новия човек:

DECLARE
  v_temp postn_matrix.person_id%TYPE;
BEGIN
  IF INSERTING THEN
    select max(person_id) into v_temp
    from postn_matrix
    where person_id = :new.person_id;

    if v_temp is null then
      -- no record found, so insert one
      insert into postn_matrix (person_id, position_count)
      values (:new.person_id, 1);
    else
      -- record exists, so update
      update postn_matrix ...
    end if;
  ...

... или използвайте merge .

Но не харесвам този модел и вие настройвате потенциала за несъответствия в данните с едновременни модификации на основната таблица. Опитът да се поддържа такъв брой не е непременно толкова лесен, колкото изглежда.

Обикновено бих предпочел да направя това изглед, който винаги ще бъде актуален и не се нуждае от задействане, което усложнява нещата:

create view postn_matrix as
  select person_id, count(*)
  from basetable
  group by person_id;

Разбира се, може да тълкувам погрешно или прекалено опростявам това, което прави вашата основна(и) таблица(и) и какво ви трябва postn_matrix за. Изглежда малко тривиално да имаш дори като гледка. Ако имате отделен person и person_position таблици, да речем, тогава можете да добавите външно съединение, за да видите хора без позиции:

create view postn_matrix as
  select p.person_id, count(pp.position_id)
  from person p
  left join person_position pp on pp.person_id = p.person_id
  group by p.person_id;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Концепция:Създайте Java програма и я заредете в Oracle DB - функцията Wrapper извиква java функция с връщане

  2. Защо не мога да актуализирам повече от една колона едновременно с ключовата дума With?

  3. Премахване на ограничение със специален знак в Oracle

  4. Oracle - изтриване на всички дъщерни записи за родител

  5. конвертиране на Oracle blob в xml тип