2017-05-30 9 views
0

私はテーブル(の予定)で更新に応答するトリガーを作成しようとしています。このトリガーはプロシージャ(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_NAMEfunction_name.variable_nameを使用してみましたも$ 1、$ 2、$ 3、...、$ nはを使用してみました。 CREATE TRIGGER docsから

+0

'select max(medical_folder.id)+ 1'の壊れたアンチパターンを使って一意のIDを生成しようとしていないことを望みます。 'max() 'を使うと、複数のトランザクションがそのテーブルに挿入されている状況では動作しません。 –

+0

これは心配してはいけませんが、これは出版される製品の種類などについてのものではありません。これは必要に応じてさらに先に解決することができます。今のところ、私の問題は、私がそれらを望んでいるように、プロセスが議論を取っていることです。これは、より多くの(実際には)魅力的なプロジェクトです。とにかく感謝してくれてありがとう、ありがとう。 – Sokratis

答えて

0

引数
トリガが実行されたときに関数に提供される引数のオプションのコンマ区切りリスト。引数はリテラル文字列定数です。 シンプルな名前と数値定数もここに書くことができますが、それらはすべて文字列に変換されます。

http://rextester.com/OCA59277

あなたはあなたがが、動的SQL(see EXECUTE)をしようとしているものを達成することができるかもしれません。しかし、私はあなたが事を複雑にすると信じています。あなたがしたいのは、UPDATEステートメントに参加した行やIDを取得するだけです。 PostgreSQLのDML文(INSERT,& DELETE)には、RETURNINGという節があります。また、実際には、writeable CTEsを使用して、1つの文内にさらに多くのDML(サブ)文を書くことができます。このような何かで十分です:

WITH upd AS (
    UPDATE appointments 
    SET  diagnosis = conclusion 
    WHERE  patientamka = patAMKA 
    AND  doctoramka = docAMKA 
    AND  t   = dateNtime 
    RETURNING * 
) 
INSERT INTO medical_folder(patient, cure, drug_id) 
SELECT patAMKAv2, cure2, drug_idv3 
FROM upd; 

を:私はあなたが実際にUPDATEからフィールドのいずれかを使用しませんが、FROM updを使用すると、できるだけ多くの行が挿入されることを保証することを実現し、これを書きながらmedical_folderと同じくらいappointmentsが更新されました。あなたのオリジナルのトリガベースのロジックがしたものです。

関連する問題