我想通過觸發器從“depart_bt”表的“nat_cond”屬性的值自動填充,同一個表的3個其他屬性的值“sect_ph”、“sect_n”、“metal_cond”每個應用split_part( ..,'_',..) 功能。
例如:如果“nat_cond”的值:3*240 120mm2_AR2V_ALU
我應該得到:
“sect_ph”:3*240 120mm2
“sect_n”:AR2V
“metal_cond”:ALU
我的代碼如下:
CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER
language plpgsql AS
$$
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
NEW.sect_ph:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 1) LIMIT 1);
NEW.sect_n:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 2) FROM depart_bt LIMIT 1);
NEW.metal_cond:= (SELECT split_part(NEW.nat_cond::TEXT, '_', 3) FROM depart_bt LIMIT 1);
END IF;
RETURN NEW;
END;
$$
;
-- table depart_bt
DROP TRIGGER IF EXISTS nat_conducteur ON depart_bt;
CREATE TRIGGER nat_conducteur BEFORE INSERT OR UPDATE ON depart_bt
FOR EACH ROW EXECUTE PROCEDURE nat_cond_auto();
但是,觸發器作業得很好,除了第一個添加的行什么都不做。
我想我回圈了一些東西。預先感謝您的幫助。
uj5u.com熱心網友回復:
您在分配中的 SELECT 陳述句完全沒有用,因為您不使用來自可能回傳的行中的任何資料。但是這些選擇也是您的觸發器不起作用的原因:如果表為空select ... from depart_bt limit 1,則不會回傳任何內容。
我想你只是想要:
CREATE OR REPLACE FUNCTION nat_cond_auto() RETURNS TRIGGER
language plpgsql AS
$$
BEGIN
IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
NEW.sect_ph := split_part(NEW.nat_cond::TEXT, '_', 1);
NEW.sect_n := split_part(NEW.nat_cond::TEXT, '_', 2);
NEW.metal_cond := split_part(NEW.nat_cond::TEXT, '_', 3);
END IF;
RETURN NEW;
END;
$$
;
請注意,這IF TG_OP = ...并不是真正必要的,因為您的觸發器定義使觸發器僅在更新或插入陳述句時觸發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527312.html
