sql >> Databáze >  >> RDS >> Oracle

kurzor ve spouštěči

Kvůli smyčce (ve které chybí výstupní klauzule - doufejme, že jste to ztratili, když jste to převedli na otázku) se pokusíte vložit záznam do pstn_matrix pro každý zaznamenejte návrat kurzoru, zda existují nějaké odpovídající :new.person_id nebo ne; a pokud existuje shoda, provedete také update . Což pravděpodobně není to, co chcete, a mimo jiné můžete získat porušení omezení. Nenastavujete také pole počítadla – pokud toto pole nelze použít, dojde k chybě. Ale neřekli jste, jaké chyby, pokud nějaké, dostáváte.

Pokud to musíte udělat prostřednictvím spouštěče, můžete buď zkontrolovat, zda vůbec existuje řádek pro novou osobu:

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

... nebo použijte merge .

Ale tento model se mi nelíbí a vy vytváříte potenciál pro nesrovnalosti v datech souběžnými úpravami základní tabulky. Snažit se udržet počet, jako je tento, není nutně tak jednoduché, jak se zdá.

Obvykle bych dal přednost tomu, aby to bylo zobrazení, které bude vždy aktuální a nepotřebuje spouštěč, který věci komplikuje:

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

Samozřejmě si možná špatně vykládám nebo příliš zjednodušuji, co vaše základní tabulka(y) dělá a co potřebujete postn_matrix pro. Zdá se to trochu triviální mít i jako pohled. Pokud máte samostatnou person a person_position řekněme tabulky, pak můžete přidat vnější spojení, abyste viděli lidi bez pozic:

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. Definice PRIMÁRNÍHO KLÍČE v příkazu MySQL CREATE TABLE

  2. Jak importovat / obnovit tabulky MySql pomocí PHP

  3. Návrh databáze pro dynamické ověřování pole formuláře

  4. 7 věcí, které byste měli vědět o oddílech v infrastruktuře Oracle Cloud Infrastructure