Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

con trỏ trong trình kích hoạt

Do vòng lặp (thiếu mệnh đề thoát - hy vọng bạn vừa mất việc dịch câu này thành câu hỏi), bạn sẽ cố gắng chèn một bản ghi vào pstn_matrix cho mọi ghi lại các con trỏ trả về, cho dù có bất kỳ :new.person_id phù hợp nào không hay không; và nếu khớp, bạn cũng sẽ thực hiện update . Điều đó có thể không phải là điều bạn muốn và bạn có thể bị vi phạm ràng buộc trong số những thứ khác. Bạn cũng không đặt trường bộ đếm của mình - nếu trường đó không thể trống thì trường đó sẽ bị lỗi. Nhưng bạn chưa cho biết bạn đang mắc phải lỗi nào, nếu có.

Nếu bạn phải thực hiện việc này thông qua trình kích hoạt thì bạn có thể kiểm tra xem có hàng cho người mới hay không:

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

... hoặc sử dụng merge .

Nhưng tôi không thích mô hình này và bạn đang thiết lập khả năng chênh lệch dữ liệu với các sửa đổi đồng thời đối với bảng cơ sở. Cố gắng duy trì một số lượng như thế này không nhất thiết phải đơn giản như bạn tưởng.

Tôi thường muốn đặt đây là một chế độ xem, chế độ này sẽ luôn được cập nhật và không cần trình kích hoạt làm phức tạp thêm mọi thứ:

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

Tất nhiên, tôi có thể hiểu sai hoặc đơn giản hóa những gì (các) bảng cơ sở của bạn làm và những gì bạn cần postn_matrix vì. Nó có vẻ hơi tầm thường khi có một lượt xem. Nếu bạn có person riêng biệt và person_position chẳng hạn như bảng, sau đó bạn có thể thêm vào một liên kết bên ngoài để xem những người không có vị trí:

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. lỗi từ khóa bị thiếu trong câu lệnh oracle CASE WHEN sql

  2. Oracle chuyển đổi hàng thành cột

  3. Lệnh gọi hàm Oracle PLSQL thành một hàm thứ hai

  4. Cách trả về danh sách các múi giờ hợp lệ trong cơ sở dữ liệu Oracle

  5. Tôi có thể bỏ qua xác minh chứng chỉ oracle utl_http không?