dynamic - Postgres : How to get the value of a dynamic column from triggers

标签 dynamic triggers postgresql-9.3

我正在尝试获取列的值,以便将其插入到包含插入行的列名称和列值的表中,但是,我无法获取该列的值我需要。通常,我可以使用 value := NEW.column_name但每个表都有一个唯一的键列名称,该名称位于表名称本身中(我知道,这很糟糕),但我已经有办法获取我想要的列名称,它正在获取该列的新值,这就是问题所在。

    CREATE OR REPLACE FUNCTION trgfn_keyvalue_insert()
    RETURNS trigger AS
    $BODY$
    DECLARE
       key_column_value character varying;
       key_column_name character varying;
       part text;
       part_array text[] := array['prefix_','_suffix'];
    BEGIN    
       key_column_name := TG_TABLE_NAME;     --parsing the table name to get the desired column name
       FOREACH part IN ARRAY part_array LOOP
          key_column_name = regexp_replace(cat, part, '');
       END loop; 

       IF TG_OP = 'INSERT' THEN    
       EXECUTE 'SELECT $1 FROM $2'           --This is where I'd like to get the 
          INTO key_column_value              --value of the column
          USING key_column_name, NEW;    

       INSERT INTO inserted_kvp
          (table_name, key, value)
          VALUES 
          (TG_TABLE_NAME, key_column_name, key_column_value);
       END IF;

       RETURN NEW;
    END;
    $BODY$
       LANGUAGE plpgsql VOLATILE

所以,当我插入表时:

    CREATE TABLE prefix_kvp1_suffix AS id SERIAL, kvp1 CHARACTER VARYING;
    CREATE TABLE prefix_kvp2_suffix AS id SERIAL, kvp2 CHARACTER VARYING;

    INSERT INTO prefix_kvp1_suffix VALUES (1, 'value1');
    INSERT INTO prefix_kvp2_suffix VALUES (1, 'value2');

我想要 inserted_kvp表具有以下内容:

    |    table_name    |key |value |
    --------------------------------
    |prefix_kvp1_suffix|kvp1|value1|
    |prefix_kvp2_suffix|kvp2|value2|

相反,我在插入时收到以下错误:

    ERROR:  syntax error at or near "$2"
    LINE 1: SELECT $1 FROM $2
                   ^
    QUERY:  SELECT $1 FROM $2
    CONTEXT:  PL/pgSQL function worldmapkit.trgfn_keyvalue_insert() line 13 at EXECUTE statement

我尝试了使用 EXECUTE format() 获取此值的不同变体和其他一些方法,但我仍然没有任何运气。如有任何帮助,我们将不胜感激!

最佳答案

经过一番折腾,我找到了问题的答案。上述 EXECUTE 语句的正确语法是:

    EXECUTE format('SELECT $1.%I', key_column_name) 
    INTO key_column_value
    USING NEW;

这将获取新记录的列值。希望这会对处于类似情况的人有所帮助。

关于dynamic - Postgres : How to get the value of a dynamic column from triggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899446/

相关文章:

jQuery 在开始触发之前检查悬停状态

sql - Where Criteria on 空场

将字符串转换为 C 中的表达式

javascript - 在实际更改选择框之前获取 onChange 值

c# - 动态对象 - 如何判断属性是否已定义?

mysql - 在每次更新时触发触发,而不仅仅是一列

postgresql - 为什么 char 数据类型会自动转换为 bpchar?

sql - 如何使用 Postgresql 对表的所有列值求和并在新行中显示总计

c - fscanf 和动态数组分配

c# - 具有动态编程的 FrameworkElement 和 FrameworkContentElement 的通用接口(interface)