我正在使用PostgreSQL 9.5。在plpgsql觸發器函數中用「array_to_string」填充變量
我在PL/pgSQL中創建一個觸發器,當在第二個表(operation_poly
)上執行INSERT
與其他表數據時,表中會添加一條記錄(synthese_poly
)。
觸發效果很好,除了一些變量,沒有填充(尤其是那些我嘗試填入一個array_to_string()
功能)。
這是代碼:
-- Function: bdtravaux.totablesynth_fn()
-- DROP FUNCTION bdtravaux.totablesynth_fn();
CREATE OR REPLACE FUNCTION bdtravaux.totablesynth_fn()
RETURNS trigger AS
$BODY$
DECLARE
varoperateur varchar;
varchantvol boolean;
BEGIN
IF (TG_OP = 'INSERT') THEN
varsortie_id := NEW.sortie;
varopeid := NEW.operation_id;
--The following « SELECT » queries take data in third-party tables and fill variables, which will be used in the final insertion query.
SELECT array_to_string(array_agg(DISTINCT oper.operateurs),'; ')
INTO varoperateur
FROM bdtravaux.join_operateurs oper INNER JOIN bdtravaux.operation_poly o ON (oper.id_joinop=o.id_oper)
WHERE o.operation_id = varopeid;
SELECT CASE WHEN o.ope_chvol = 0 THEN 'f' ELSE 't' END as opechvol INTO varchantvol
FROM bdtravaux.operation_poly o WHERE o.operation_id = varopeid;
-- «INSERT» query
INSERT INTO bdtravaux.synthese_poly (soperateur, schantvol) SELECT varoperateur, varchantvol;
RAISE NOTICE 'varoperateur value : (%)', varoperateur;
RAISE NOTICE 'varchantvol value : (%)', varchantvol;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION bdtravaux.totablesynth_fn()
OWNER TO postgres;
這是觸發:
-- Trigger: totablesynth on bdtravaux.operation_poly
-- DROP TRIGGER totablesynth ON bdtravaux.operation_poly;
CREATE TRIGGER totablesynth
AFTER INSERT
ON bdtravaux.operation_poly
FOR EACH ROW
WHEN ((new.chantfini = true))
EXECUTE PROCEDURE bdtravaux.totablesynth_fn();
的varchantvol
變量填寫正確,但varoperateur
爲保持拼命空(NULL值)(等synthese_poly
表中的相應字段)。
注:
的SELECT array_to_string(…) ...
查詢本身(與pgAdmin的推出,沒有INTO varoperateur
並用值替換varopeid
)效果很好,並返回一個字符串。
我試圖更改array_to_string()
函數和變量的數據類型(使用::varchar
或::text
...),沒有任何工作。 你看到會發生什麼?
觸發功能的文本排序結合實際的***觸發器***,這是缺少的。 –
謝謝你的建議。我添加了觸發器。 –