Триггерная функция, которая заменяет пустую строку на NULL в PostgreSQL

Потребовалось реализовать универсальную триггерную функцию, которая заменяет значения '' на NULL. Столкнулся с проблемой:

  1. Не могу реализовать универсальную функцию без использования динамического SQL. 2.Динамический SQL не работает как я хочу.

Мой пример:

CREATE OR REPLACE FUNCTION stg.replace_str_to_null_ag_null_test()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
DECLARE
v_col_name TEXT;
v_col_value TEXT;
BEGIN
    --Перебор всех столбцов таблицы
    FOR v_col_name IN
        SELECT column_name
        FROM information_schema."columns" t
        WHERE t.table_schema = TG_TABLE_SCHEMA
        AND t.table_name = TG_TABLE_NAME
        AND t.data_type = 'text'
        
            LOOP    
                EXECUTE format('SELECT ($1).%I', v_col_name) INTO v_col_value USING NEW;
                RAISE NOTICE 'NAME: %, VALUE: %', v_col_name, v_col_value;
                IF v_col_value = '' THEN
                    EXECUTE format('UPDATE %I.%I SET %I = NULL WHERE ctid = $1', TG_TABLE_SCHEMA, TG_TABLE_NAME, v_col_name) USING NEW.ctid;
                END IF;
            END LOOP;
    RETURN NEW;
END;
$function$
;

Подключение:

CREATE TABLE stg.ag_null_test (
    fld_1 text NULL,
    fld_2 varchar(30) NULL,
    fld_3 numeric NULL,
    fld_4 bpchar(5) NULL
);

-- Table Triggers
CREATE TRIGGER tr_replace_strings_to_null BEFORE INSERT
OR UPDATE ON
stg.ag_null_test FOR EACH ROW EXECUTE FUNCTION stg.replace_str_to_null_ag_null_test();

Пример вставки:

INSERT INTO stg.ag_null_test(fld_1,fld_2,fld_3,fld_4)
values('','',-1,'');

В данном примере ошибку я не ловлю, когда вставляю данные, но пустая строка в Null не преобразовывается.


Ответы (1 шт):

Автор решения: Guzya

У вас триггер на BEFORE, вам просто надо вернуть строку NEW, в которой нужным полям присвоить Null, и эта строка будет вставлена.

А вы обновляете строку, которая еще не вставлена.

→ Ссылка