Postgresql 触发器错误:用作表达式的子查询返回多于一行

问题描述 投票:0回答:1

我有一个启用了此功能的 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 语句

postgresql triggers
1个回答
0
投票

这里是插入语句的解决方案:

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();
© www.soinside.com 2019 - 2024. All rights reserved.