2014-09-17 2 views
2

열의 값을 가져 와서 삽입 된 행의 열 이름과 열 값을 보유하는 테이블에 삽입 할 수 있지만, 나는 필요한 칼럼의 가치를 얻을 수 없었다. 일반적으로 value := NEW.column_name을 사용할 수는 있지만 각 테이블에는 테이블 이름 자체에있는 고유 한 키 열 이름이 있습니다 (나쁘다는 것을 알고 있습니다). 그러나 이미 원하는 열 이름을 가져 오는 방법이 있습니다. 해당 열의 새로운 가치입니다.Postgres : 트리거에서 동적 열의 값을 얻는 방법

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 테이블 싶습니다

은 다음 가지고 : 나는 테이블에 삽입 그래서

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 

, 대신

| 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()과 몇 가지 다른 방법을 사용하여이 값을 얻는 다양한 변형을 시도했지만 여전히 운이 없다. 어떤 도움을 주셔서 감사합니다!

답변

4

많이 들키면 내 질문에 대한 답을 찾았습니다. 위의 EXECUTE 문에 대한 올바른 구문은 다음과 같습니다

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

이 새로운 레코드의 열 값을 얻을 것이다. 바라기를, 이것은 유사한 상황에있는 누군가를 도울 것입니다.

+0

멋지게 완료되었습니다. 나는 이것이 PL/PgSQL에 추가되었다는 것을 잊어 버렸다. –

관련 문제