我有一个启用了此功能的 PostgreSQL 数据库。该函数应使用其他字段的值自动填充 num_accessione 字段,如代码所示。
CREATE OR REPLACE FUNCTION dati_raccolta_pop_accessione()
RETURNS TRIGGER AS
$datiraccoltapopaccessione$
BEGIN
IF (TG_OP='INSERT') THEN
UPDATE dati_raccolta
SET num_accessione = (
SELECT
CASE
WHEN interesse_agricolo = 'si' THEN
CONCAT(
banca_germoplasma, '_A_',
REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '_', gid, '_',
UPPER(
REGEXP_REPLACE(
REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),
'\s+', '', 'g'
)
)
)
WHEN interesse_agricolo = 'no' THEN
CONCAT(
banca_germoplasma, '_N_',
REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '_', gid, '_',
UPPER(
REGEXP_REPLACE(
REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),
'\s+', '', 'g'
)
)
)
END
FROM dati_raccolta
);
ELSIF (TG_OP='UPDATE') THEN
UPDATE dati_raccolta AS t
SET num_accessione = (
SELECT
CASE
WHEN interesse_agricolo = 'si' THEN
CONCAT(
banca_germoplasma, '_A_',
REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '_', gid, '_',
UPPER(
REGEXP_REPLACE(
REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),
'\s+', '', 'g'
)
)
)
WHEN interesse_agricolo = 'no' THEN
CONCAT(
banca_germoplasma, '_N_',
REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '_', gid, '_',
UPPER(
REGEXP_REPLACE(
REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),
'\s+', '', 'g'
)
)
)
END
FROM dati_raccolta
);
END IF;
RETURN NEW;
END;
$datiraccoltapopaccessione$
LANGUAGE plpgsql;
CREATE TRIGGER dati_raccolta_pop_num_accessione_insert
AFTER INSERT ON dati_raccolta
FOR EACH STATEMENT
EXECUTE PROCEDURE dati_raccolta_pop_accessione();
CREATE TRIGGER dati_raccolta_pop_num_accessione_update
AFTER UPDATE ON dati_raccolta
FOR EACH ROW
WHEN (OLD.geom IS DISTINCT FROM NEW.geom)
EXECUTE PROCEDURE dati_raccolta_pop_accessione();
不幸的是,我收到以下错误:
错误:用作表达式的子查询返回多于一行 上下文:SQL 语句“UPDATE dati_raccolta SET num_accessione = ( 选择 案件 当 interesse_agricolo = 'si' 那么 康卡特( banca_germoplasma, 'A', REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '', gid, '', 上( REGEXP_REPLACE( REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', ' ', 'g'), '\s+'、''、'g' ) ) ) 当 interesse_agricolo = 'no' 那么 康卡特( banca_germoplasma, 'N', REGEXP_REPLACE(data_raccolta::text, '-', '', 'g'), '', gid, '', 上( REGEXP_REPLACE( REGEXP_REPLACE(nome_raccoglitore, '\y(\w)\w*', ' ', 'g'), '\s+'、''、'g' ) ) ) 结尾 来自 dati_raccolta )” PL/pgSQL 函数 dati_raccolta_pop_accessione() 第 4 行 SQL 语句
这里是插入语句的解决方案:
CREATE OR REPLACE FUNCTION dati_raccolta_pop_accessione()
RETURNS TRIGGER AS
$datiraccoltapopaccessione$
DECLARE
accessione_calcolata TEXT;
BEGIN
IF (TG_OP='INSERT') THEN
accessione_calcolata := (
CASE
WHEN NEW.interesse_agricolo = 'si' THEN concat(NEW.banca_germoplasma, '_A_', REGEXP_REPLACE(NEW.data_raccolta::text, '-', '', 'g'), '_', NEW.gid, '_',
UPPER (
REGEXP_REPLACE (
REGEXP_REPLACE (NEW.nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),'\s+', '', 'g'
)
)
)
WHEN NEW.interesse_agricolo = 'no' THEN concat(NEW.banca_germoplasma, '_N_', REGEXP_REPLACE(NEW.data_raccolta::text, '-', '', 'g'), '_', NEW.gid, '_',
UPPER (
REGEXP_REPLACE (
REGEXP_REPLACE (NEW.nome_raccoglitore, '\y(\w)\w*', '\1', 'g'),'\s+', '', 'g'
)
)
)
END
);
END IF;
NEW.num_accessione := accessione_calcolata;
RETURN NEW;
END;
$datiraccoltapopaccessione$
LANGUAGE plpgsql;
CREATE TRIGGER dati_raccolta_pop_num_accessione_insert
BEFORE INSERT ON dati_raccolta
FOR EACH ROW
EXECUTE FUNCTION dati_raccolta_pop_accessione();