2017-12-07 8 views
0

가변 개수의 열이있는 테이블에 동적 인 insert을 실행해야합니다.배열을 레코드/튜플/행 유형으로 바꾸려면 어떻게해야합니까?

지금 그때 quote_nullable으로, 열 이름, quote_ident으로, 실제 값을 모두 인용하고있어 array_to_string로 합류 :

for ... loop 
    ... 
    cols := array_append(cols, quote_ident(column_name)); 
    vals := array_append(vals, quote_nullable(column_value)); 
end loop; 

execute format('insert into %s (%s) values (%s)', 
    target_table, 
    array_to_string(cols, ', ') 
    array_to_string(vals, ', ') 
); 

그것은 패턴을 포함, 사방 찾았다 공식 문서. 그러나 그것은 약간 부정하다고 느낍니다. 차라리 using 절에서 값의 배열을 매개 변수를 전달 것 :

execute format('insert into %s (%s) ... $1 ...', 
    target_table, 
    array_to_string(cols, ', ') 
) 
using vals; 

공지 사항 내가 달성하고 싶은 것입니다 using vals. 하지만 insert 문에서 점을 채울 수없는 것 같습니다. 어떤 종류의 select ... from ...일까요?

보다 일반적으로 배열을 레코드/튜플/행 유형으로 바꾸려면 어떻게해야합니까?

EXECUTE (SELECT 'insert into sometable ' 
    '('||string_agg(quote_ident(p.key),',') || 
      ') values ('|| string_agg(quote_nullable(p.value),',') || ');' 
      FROM each(payload) as p 
      ); 

을하지만, 여기에 페이로드는 hstore가 아닌 배열 된 한 쌍의 :

답변

0

나는 생산에 매우 같은 코드를 사용하고 있습니다.

+0

쿼리의 SQL 부분을 구성하기 때문에'quote_ident'는 괜찮습니다. 하지만 모든 quote_nullable' 값을 피할 방법을 찾고 있어요 그냥 배열 매개 변수로 전달하십시오. – Tobia

+0

나는 네가 한 일을 완전히 잘못 읽었다. – Jasen