Триггерная функция, которая заменяет пустую строку на NULL в PostgreSQL
Потребовалось реализовать универсальную триггерную функцию, которая заменяет значения '' на NULL. Столкнулся с проблемой:
- Не могу реализовать универсальную функцию без использования динамического 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
, и эта строка будет вставлена.
А вы обновляете строку, которая еще не вставлена.