sql >> Database teknologi >  >> RDS >> Oracle

markøren i en trigger

På grund af løkken (som mangler en exit-klausul - forhåbentlig har du lige mistet det ved at oversætte dette til et spørgsmål) vil du forsøge at indsætte en post i pstn_matrix for hver optag markørens returnering, om der er nogen matchende :new.person_id eller ikke; og hvis der er match, skal du også foretage update . Hvilket sandsynligvis ikke er, hvad du ønsker, og du kan blandt andet få en overtrædelse af begrænsningen. Du sætter heller ikke dit tællerfelt - hvis det ikke er nullbart, vil det fejle. Men du har ikke sagt, hvilke fejl, hvis nogen, du får.

Hvis du skal gøre dette gennem en trigger, kan du enten tjekke, om der overhovedet er en række til den nye person:

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;
  ...

... eller brug merge .

Men jeg kan ikke lide denne model, og du opsætter potentialet for data-uoverensstemmelser med samtidige ændringer af basistabellen. At forsøge at opretholde en optælling som denne er ikke nødvendigvis så simpel, som det ser ud til.

Jeg foretrækker normalt at gøre dette til en visning, som altid vil være opdateret og ikke behøver den udløser, der komplicerer tingene:

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

Selvfølgelig kan jeg misfortolke eller overforenkle, hvad dine basistabeller gør, og hvad du har brug for postn_matrix til. Det virker lidt trivielt at have selv som udsigt. Hvis du har en separat person og person_position tabeller, for eksempel, så kan du tilføje en ydre joinforbindelse for at se personer uden positioner:

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. CSV-data til postgreSQL ved hjælp af Python

  2. Hvad er MySQL:En oversigt

  3. Opdel streng med to skilletegn og konverter type

  4. Sådan udtrækkes en understreng fra en streng i Oracle/SQLite