Dynami c имя столбца в функции - PullRequest
0 голосов
/ 02 мая 2020

Как мне создать динамические c имена столбцов, которые можно использовать в триггере? У меня есть триггерная функция, которая должна обновлять значение в таблице. Имя столбца создается динамически. Но когда я его запускаю, ошибка выдает не asp имя столбца, а имя переменной. Код должен был создать пример имени столбца: p123

ОШИБКА: столбец «имя-столбца» отношения «col_extra_val_lookup» не существует ЛИНИЯ 2: SET имя-столбца = NEW.value

Я использую следующий код:

 DECLARE
column_name TEXT ;
BEGIN
column_name  :='p'|| NEW.customer_column_id;

UPDATE col_extra_val_lookup
SET column_name = NEW.value 
WHERE col_extra_val_lookup.customer_id=NEW.customer_id;
END

1 Ответ

2 голосов
/ 03 мая 2020

Вы получаете значения, потому что это единственное, что может дать ссылка на точку данных. Чтобы получить то, что вы ищете, вам нужен Dynami c SQL. Вы пытаетесь взять значение данных и создать столбец с этим значением (с префиксом «p»). Это действительно очень плохой план . Поскольку у вас нет возможности узнать значение customer_column_name до того, как ваш триггер также должен изменить таблицу. Но если у вас нет очень строгого контроля над этим значением, вы можете получить очень странные имена столбцов.

Ниже показан один из способов выполнения того, что вы просили. Но прежде чем сделать это, я предлагаю вам посмотреть здесь , чтобы увидеть, что может произойти, и если вы готовы справиться с возможными последствиями, по крайней мере, с его текущими ограничениями (код).

create or replace function really_bad_idea()
  returns trigger 
  language plpgsql
as $$
declare 
    k_add_column   constant text =
      'alter table col_extra_val_lookup add column if not exists %I text';
    k_update_lookup constant text = 
      'update col_extra_val_lookup set %I = $1 where customer_id = $2'; 

    column_name character varying(63);  -- normal Postgres max length for column name
begin 
    column_name = 'p'|| NEW.customer_column_id;
    execute format(k_add_column, column_name);
    execute format(k_update_lookup, column_name) using new.value, new.customer_id;
    return new;
end; 
$$; 

Приятных побочных эффектов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...