sql >> データベース >  >> RDS >> Oracle

トリガーのカーソル

    ループ(exit句がない-これを質問に変換することを失ったことを願っています)のため、pstn_matrixにレコードを挿入しようとしています。 すべて 一致する:new.person_idがあるかどうかに関係なく、カーソルが返す値を記録します か否か;一致する場合は、updateも実行します 。これはおそらくあなたが望むものではなく、とりわけ制約違反が発生する可能性があります。また、カウンターフィールドを設定していません。それがnull許容でない場合は、エラーが発生します。しかし、どのようなエラーが発生しているのかについては、まだ述べていません。

    トリガーを介してこれを行う必要がある場合は、新しい人の行があるかどうかを確認できます。

    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. 条件なしですべてを選択する際の高価な全表スキャン

    2. mysqlデータベースからJSON配列を構築する方法

    3. 次のSQLコードがデータを挿入できなかった理由は何ですか?

    4. SQLクエリで等しいまたはin未満を使用することをお勧めします