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가 아닌 배열 된 한 쌍의 :
쿼리의 SQL 부분을 구성하기 때문에'quote_ident'는 괜찮습니다. 하지만 모든 quote_nullable' 값을 피할 방법을 찾고 있어요 그냥 배열 매개 변수로 전달하십시오. – Tobia
나는 네가 한 일을 완전히 잘못 읽었다. – Jasen