सबसे पहले, आपको पंक्ति चर को BEFORE
. में पास करना होगा चालू कर देना। पासिंग NULL
पंक्ति के लिए कार्रवाई रद्द करता है:
CREATE OR REPLACE FUNCTION insbef_events_function()
RETURNS TRIGGER AS
$func$
DECLARE
m int[];
BEGIN
FOREACH m SLICE 1 IN ARRAY TG_ARGV[0]::int[]
LOOP
INSERT INTO events (measurement_id, event_index_start, event_index_end)
SELECT NEW.measurement_id, m[1], m[2]; -- Postgres array subscripts start with 1
END LOOP;
-- do something with _result ...
RETURN NEW; -- NULL would cancel operation in BEFORE trigger!
END
$func$ LANGUAGE plpgsql;
मैंने RETRUN NULL
. के उपयोग का प्रदर्शन किया एक AFTER
. में ट्रिगर मेरे पिछले उत्तर में
. आप BEFORE
. के लिए ऐसा नहीं कर सकते चालू कर देना। मैनुअल:
वहां और अधिक है। मैनुअल पढ़ें।
लेकिन चूंकि अब आप एक 2-आयामी सरणी के बजाय दो 1-आयामी सरणी पास कर रहे हैं, इसलिए आपको अपने ट्रिगर तर्क को अनुकूलित करने की आवश्यकता है:
CREATE OR REPLACE FUNCTION insbef_events_function()
LANGUAGE plpgsql RETURNS TRIGGER AS
$func$
DECLARE
a1 int[] := TG_ARGV[1]::int[];
a2 int[] := TG_ARGV[2]::int[];
BEGIN
FOR i in array_lower(a1, 1) .. array_upper(a1, 1)
LOOP
INSERT INTO events (measurement_id, event_index_start, event_index_end)
SELECT NEW.measurement_id -- or TG_ARGV[0]::int instead?
, a1[i], a2[i];
END LOOP;
RETURN NEW; -- NULL would cancel operation in BEFORE trigger!
END
$func$;
यह आपकी ज़िम्मेदारी है कि दोनों सरणियों में तत्वों की संख्या समान हो।
ट्रिगर बदलने वाला फ़ंक्शन अब इस तरह दिखाई दे सकता है:
CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text)
LANGUAGE plpgsql RETURNS void AS
$func$
BEGIN
EXECUTE format(
$$DROP TRIGGER IF EXISTS insbef_ids ON measurements; -- on measurements ..
CREATE TRIGGER insbef_ids
BEFORE INSERT ON measurements -- .. according to previous posts!!
FOR EACH ROW EXECUTE PROCEDURE insbef_events_function(%s, %L, %L)$$
, _arg1
, translate(_arg2, '[]', '{}')
, translate(_arg3, '[]', '{}')
);
END
$func$;
इस उन्नत स्वचालित डिज़ाइन का उपयोग करने से पहले आपको SQL, PL/pgSQL, ट्रिगर फ़ंक्शंस और सरणी हैंडलिंग की मूल बातें समझने की आवश्यकता है।