コメントではこれほど多くのテキストが許可されないため、これを回答として投稿します。
あなたのテーブルを見ると、まだはっきりしていないことがあります。関数 ADD_PACIENTE_QUARTO
SELECT
を実装します 述語 Where PAC = CONT
を記述するステートメント しかし PAC
PACIENTE
にありません の仕様ではなく、結果と CONT
を格納するローカル変数です はあなたのパラメーターです。そこで何を試したかは明確ではありません。
トリガーのロジックと実装にいくつかの欠陥があります。
まず、トリガーの名前は PACIENTE_TRIGGER
です しかし、行 INSERT OR UPDATE ON TIPO_QUARTO
TIPO_QUARTO
にあると教えてくれました これは構文的には問題ではありませんが、トリガーがどのテーブルに属しているかを理解しようとしている人にとっては、論理的には厄介な問題になる可能性があります.
次に、INSERT OR UPDATE OF TIPO ON TIPO_QUARTO
を使用します 挿入の監視または変更の更新のみ 列 TIPO
に TIPO_QUARTO
の
この行 If :new.TIPO_QUARTO = 'UTI' then
、このトリガーが TIPO_QUARTO
にアタッチされていると仮定します テーブル、そのテーブルには TIPO_QUARTO
という名前の列がありません これを :new.TIPO
に変更します .
次に、PAC
タイプは VARCHAR
です PAC := PAC - :new.TIPO;
で何をしようとしているのか、私にはわかりません。 PAC := PAC + :new.TIPO;
で 両方の行で invalid number
がスローされます 文字列を加算または減算することはできないため、例外として、連結または部分文字列の取得が意図されている可能性があります。
最後に UPDATE TIPO_QUARTO SET TIPO = PAC
の呼び出し TIPO_QUARTO
のトリガー内 mutating table
になります 例外として、DML ステートメント (この場合は INSERT または UPDATE) の途中にあるテーブルをクエリ/更新することはできません。これを修正するには、 :new.TIPO := PAC
を割り当てるだけです。 .
この詳細に気をつければ、おそらく問題は解決します。