私はテーブル(の予定)で更新に応答するトリガーを作成しようとしています。このトリガーはプロシージャ(proc1())を呼び出します。プロシージャは、別のテーブル(medical_folder)に新しい行(これらの引数に基づいて)を挿入するために引数を取得する必要があります。手続きは引数を持つことはできませんが、検索のビットの後、私はあなたがちょっとかかわらず、あなたのように強制するために、次のような方法を使用できることが見つかりました:私が作った私のベースとして上記で関数から引数をTRIGGERの作成に渡すにはどうすればよいですか?
Passing arguments to a trigger function
を次のようにUDF:次のように
CREATE OR REPLACE FUNCTION AppointmentUpdate(docAMKA bigint, patAMKA bigint, dateNtime timestamp, conclusion varchar(500),cure2 varchar(500), drug_id integer)
RETURNS void AS $$
DECLARE
patAMKAv2 text;
drug_idv3 text;
BEGIN
patAMKAv2 := cast(AppointmentUpdate.patAMKA as text);
drug_idv3 := cast(AppointmentUpdate.drug_id as text);
DROP TRIGGER IF EXISTS tr1 on appointments;
CREATE TRIGGER tr1 BEFORE UPDATE ON appointments
EXECUTE PROCEDURE proc1(patAMKAv2,cure2,drug_idv3);
UPDATE appointments
SET diagnosis = conclusion
WHERE patientamka = patAMKA
AND doctoramka = docAMKA
AND t = dateNtime;
END;
$$ LANGUAGE plpgsql;
私の手順は次のとおりです。
CREATE OR REPLACE FUNCTION proc1()
RETURNS trigger AS $$
declare
newid integer;
BEGIN
newid =((select max(medical_folder.id) from medical_folder)+1);
INSERT INTO medical_folder AS Medf(id,patient,cure,drug_id)
VALUES(newid,cast(TG_ARGV[0] as bigint),TG_ARGV[1],cast(TG_ARGV[2] as integer));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
私はPROCでエラーを取得していているとして、それを実行する場合1()ここにcast(TG_ARGV[0] as bigint)
とUDFの引数の値を送信するのではなく、それ自体が引数を送信するように思われます(たとえば、これはEXECUTE PROCEDURE proc1(324,cure2,234);
の代わりにEXECUTE PROCEDURE proc1(patAMKAv2,cure2,drug_idv3);
)。その代わりに値を取得する方法はありますか?
P.S.:Iこれは、TRIGGERを使用せずにもっと簡単に行うことができ、すべてのことを行うUDFを作成するだけですが、残念ながらTRIGGERを使用しなければなりません。
P.S.2:私だけではなく、VAR_NAMEのfunction_name.variable_nameを使用してみましたも$ 1、$ 2、$ 3、...、$ nはを使用してみました。 CREATE TRIGGER
docsから
'select max(medical_folder.id)+ 1'の壊れたアンチパターンを使って一意のIDを生成しようとしていないことを望みます。 'max() 'を使うと、複数のトランザクションがそのテーブルに挿入されている状況では動作しません。 –
これは心配してはいけませんが、これは出版される製品の種類などについてのものではありません。これは必要に応じてさらに先に解決することができます。今のところ、私の問題は、私がそれらを望んでいるように、プロセスが議論を取っていることです。これは、より多くの(実際には)魅力的なプロジェクトです。とにかく感謝してくれてありがとう、ありがとう。 – Sokratis