Oracle
 sql >> Baza danych >  >> RDS >> Oracle

kursor w spuście

Z powodu pętli (w której brakuje klauzuli wyjścia - mam nadzieję, że właśnie zgubiłeś to tłumaczenie na pytanie) spróbujesz wstawić rekord do pstn_matrix dla każdego zapisz zwrot kursora, czy są jakieś pasujące :new.person_id albo nie; a jeśli jest dopasowanie, wykonasz również update . Co prawdopodobnie nie jest tym, czego chcesz i możesz między innymi naruszyć ograniczenia. Nie ustawiasz również swojego pola licznika - jeśli to nie jest możliwe do zerowania, spowoduje to błąd. Ale nie powiedziałeś, jakie błędy, jeśli w ogóle, otrzymujesz.

Jeśli musisz to zrobić za pomocą wyzwalacza, możesz albo sprawdzić, czy w ogóle istnieje wiersz dla nowej osoby:

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

... lub użyj merge .

Ale nie podoba mi się ten model i konfigurujesz potencjalne rozbieżności danych z równoczesnymi modyfikacjami tabeli podstawowej. Próba utrzymania takiego liczenia niekoniecznie jest tak prosta, jak się wydaje.

Zwykle wolałbym, aby był to widok, który zawsze będzie aktualny i nie wymaga komplikacji wyzwalacza:

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

Oczywiście mogę błędnie interpretować lub nadmiernie upraszczać, co robi twoja tabela bazowa i czego potrzebujesz postn_matrix dla. Wydaje się to trochę trywialne mieć nawet jako widok. Jeśli masz oddzielną person i person_position powiedzmy, tabele, wtedy możesz dodać sprzężenie zewnętrzne, aby zobaczyć osoby bez pozycji:

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. Czy mogę przestawiać wiersze dat na kolumny bez konieczności określania dat w przestawieniu? Oracle SQL

  2. zapisz specjalny znak ansi w bazie danych Oracle za pomocą php

  3. Moja podróż OOW15 jest zakończona

  4. Oracle wybierz z wielu tabel

  5. Pobieranie i wyświetlanie danych z bazy danych Oracle