【问题标题】:Dynamic column name in function函数中的动态列名
【发布时间】:2020-05-02 15:28:44
【问题描述】:

如何创建可在触发器中使用的动态列名?我有一个触发器函数,它应该更新表中的值。列名是动态创建的。但是当我运行它时,错误并没有掌握列名,而是掌握了变量的名称。代码应该做的是创建一个列名示例:p123

错误:关系“col_extra_val_lookup”的列“column_name”确实 不存在第 2 行:SET column_name = 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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您会得到值,因为这是引用数据点唯一能够给出的东西。要获得所需的内容,您需要动态 SQL。您正在尝试的是获取一个数据值并使用该值创建一个列(以“p”为前缀)。这确实是一个非常糟糕的计划。由于您无法在触发器之前知道 customer_column_name 的值,因此还必须更改表。但是除非您对该值有非常严格的控制,否则您可能会得到非常奇怪的列名。

    以下显示了完成您所要求的一种方法。
    但在你这样做之前,我建议你look here 看看会发生什么,以及你是否准备好处理可能的后果,至少在当前的限制(代码)的情况下。

    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; 
    $$; 
    

    享受您的副作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2020-05-19
      • 2010-10-15
      相关资源
      最近更新 更多