PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ง‘ํ•ฉ ๋ฐ ์„ ํƒ์„ SQL์— ์ „๋‹ฌ

๋•Œ๋•Œ๋กœ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง‘ํ•ฉ ๋˜๋Š” ์ „์ฒด ์„ ํƒ์„ ์š”์ฒญ์— ์ „๋‹ฌ "์ž…๊ตฌ์—์„œ". ๋•Œ๋•Œ๋กœ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งค์šฐ ์ด์ƒํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ง‘ํ•ฉ ๋ฐ ์„ ํƒ์„ SQL์— ์ „๋‹ฌ
"๋ฐ˜๋Œ€์—์„œ" ๊ฐ€์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์•ˆ๋˜๋Š”์ง€, ์™œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

์š”์ฒญ ๋ณธ๋ฌธ์— ๊ฐ’์„ ์ง์ ‘ "์‚ฝ์ž…"

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

query = "SELECT * FROM tbl WHERE id = " + value

... ๋˜๋Š” ์ด์™€ ๊ฐ™์ด:

query = "SELECT * FROM tbl WHERE id = :param".format(param=value)

์ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งํ•˜๊ณ , ์“ฐ๊ณ , ์‹ฌ์ง€์–ด ๊ทธ๋ ค ์ถฉ๋ถ„ํ•œ:

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ง‘ํ•ฉ ๋ฐ ์„ ํƒ์„ SQL์— ์ „๋‹ฌ

๊ฑฐ์˜ ํ•ญ์ƒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค SQL ์‚ฝ์ž…์— ๋Œ€ํ•œ ์ง์ ‘ ๊ฒฝ๋กœ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๊ฐ•์ œ๋กœ "์ ‘์ฐฉ"ํ•ด์•ผ ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ถ€ํ•˜.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ์ •๋‹นํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒํ‹ฐ์…”๋‹ ์‚ฌ์šฉ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๊ณ„ํš์„ ์œ„ํ•ด PostgreSQL ๋ฒ„์ „ 10 ์ดํ•˜์—์„œ. ์ด ๋ฒ„์ „์—์„œ ์Šค์บ” ์„น์…˜ ๋ชฉ๋ก์€ ์ „์†ก๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์š”์ฒญ ๋ณธ๋ฌธ์„ ๊ธฐ์ค€์œผ๋กœ๋งŒ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

$n ์ธ์ˆ˜

์‚ฌ์šฉ ์ž๋ฆฌ ํ‘œ์‹œ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค€๋น„๋œ ์ง„์ˆ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ด ํ•œ ๋ฒˆ๋งŒ ๊ตฌ์„ฑ๋˜๊ณ  ์ „์†ก๋จ)๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„(์š”์ฒญ์˜ ๊ฐ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์žฌ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ๊ณ„ํš์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ) ๋ชจ๋‘์—์„œ ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

์ธ์ˆ˜์˜ ๊ฐ€๋ณ€ ๊ฐœ์ˆ˜

์•Œ ์ˆ˜ ์—†๋Š” ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

... id IN ($1, $2, $3, ...) -- $1 : 2, $2 : 3, $3 : 5, ...

์ด ์–‘์‹์— ์š”์ฒญ์„ ๋‚จ๊ธฐ๋ฉด ์ž ์žฌ์  ์ธ ์ฃผ์ž…์œผ๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์š”์ฒญ์„ ๋ถ™์ด๊ฑฐ๋‚˜ ํŒŒ์‹ฑํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ์ˆ˜์—์„œ ๊ฐ ์˜ต์…˜์— ๋Œ€ํ•ด. ๋งค๋ฒˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋ฏธ ๋‚ซ์ง€ ๋งŒ ๊ทธ๊ฒƒ ์—†์ด๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์ „๋‹ฌํ•˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ์ง๋ ฌํ™”๋œ ํ‘œํ˜„:

... id = ANY($1::integer[]) -- $1 : '{2,3,5,8,13}'

์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ธ์ˆ˜๋ฅผ ์›ํ•˜๋Š” ๋ฐฐ์—ด ์œ ํ˜•์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ „์†ก(๋งคํŠธ๋ฆญ์Šค)

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋“ค์€ "ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ" ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

INSERT INTO tbl(k, v) VALUES($1,$2),($3,$4),...

์œ„์—์„œ ์„ค๋ช…ํ•œ ์š”์ฒญ์˜ "์žฌ์ ‘์ฐฉ" ๋ฌธ์ œ ์™ธ์—๋„ ์ด๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ์ถฉ๋Œ. ์ด์œ ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. PG๋Š” ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ์„ธํŠธ์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ์˜ํ•ด์„œ๋งŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ž„์ƒ ์‚ฌ๋ก€์—์„œ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. $9000๋ณด๋‹ค ํฐ "๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„" ์ธ์ˆ˜ - ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ๋งˆ์„ธ์š”.

์ด๋ฏธ ์ ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. "XNUMX๋‹จ๊ณ„" ์ง๋ ฌํ™”:

INSERT INTO tbl
SELECT
  unnest[1]::text k
, unnest[2]::integer v
FROM (
  SELECT
    unnest($1::text[])::text[] -- $1 : '{"{a,1}","{b,2}","{c,3}","{d,4}"}'
) T;

์˜ˆ, ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ "๋ณต์žกํ•œ" ๊ฐ’์˜ ๊ฒฝ์šฐ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž„์˜์˜ ์ˆ˜์˜ ํ•„๋“œ๋กœ ์„ ํƒ ํ•ญ๋ชฉ์„ "ํ™•์žฅ"ํ•  ์ˆ˜ ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์–ธ๋„ค์ŠคํŠธ, ์–ธ๋„ค์ŠคํŠธ, โ€ฆ

๋•Œ๋•Œ๋กœ ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ "๋ฐฐ์—ด์˜ ๋ฐฐ์—ด" ๋Œ€์‹  ์—ฌ๋Ÿฌ "์—ด์˜ ๋ฐฐ์—ด"์„ ์ „๋‹ฌํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ๊ธฐ์‚ฌ์—์„œ:

SELECT
  unnest($1::text[]) k
, unnest($2::integer[]) v;

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์—ด์— ๋Œ€ํ•œ ๊ฐ’ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•  ๋•Œ ์‹ค์ˆ˜๋ฅผ ํ•˜๋”๋ผ๋„ ์™„์ „ํžˆ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ, ๋˜ํ•œ ์„œ๋ฒ„ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

-- $1 : '{a,b,c}', $2 : '{1,2}'
-- PostgreSQL 9.4
k | v
-----
a | 1
b | 2
c | 1
a | 2
b | 1
c | 2
-- PostgreSQL 11
k | v
-----
a | 1
b | 2
c |

JSON

๋ฒ„์ „ 9.3๋ถ€ํ„ฐ PostgreSQL์—๋Š” json ์œ ํ˜• ์ž‘์—…์„ ์œ„ํ•œ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ๋ฐ”๋กœ ๊ฑฐ๊ธฐ์—์„œ ์–‘์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ์šฉ json ๊ฐ์ฒด:

SELECT
  key k
, value v
FROM
  json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'

์ด์ „ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ(hstore), ๊ทธ๋Ÿฌ๋‚˜ hstore์—์„œ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ "์ ‘๊ธฐ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

json_populate_recordset

"์ž…๋ ฅ" json ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๋ถ€ ํ…Œ์ด๋ธ”์„ ์ฑ„์šธ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ "์—ญ์ฐธ์กฐ" ํ•„๋“œ์™€ json_populate_recordset ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋น„์šฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT
  *
FROM
  json_populate_recordset(
    NULL::pg_class
  , $1::json -- $1 : '[{"relname":"pg_class","oid":1262},{"relname":"pg_namespace","oid":2615}]'
  );

json_to_recordset

๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋Š” ํ…Œ์ด๋ธ” ํ˜•์‹์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์ „๋‹ฌ๋œ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ์„ ํƒ ํ•ญ๋ชฉ์œผ๋กœ "ํ™•์žฅ"ํ•ฉ๋‹ˆ๋‹ค.

SELECT
  *
FROM
  json_to_recordset($1::json) T(k text, v integer);
-- $1 : '[{"k":"a","v":1},{"k":"b","v":2}]'
k | v
-----
a | 1
b | 2

์ž„์‹œ ํ…Œ์ด๋ธ”

๊ทธ๋Ÿฌ๋‚˜ ์ „์†ก๋œ ์ƒ˜ํ”Œ์˜ ๋ฐ์ดํ„ฐ ์–‘์ด ๋งค์šฐ ํฐ ๊ฒฝ์šฐ ์ด๋ฅผ ํ•˜๋‚˜์˜ ์ง๋ ฌํ™”๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋˜์ง€๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ  ๋•Œ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น. ์˜ˆ๋ฅผ ๋“ค์–ด ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ทœ๋ชจ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ๋ฐฐ์น˜๋ฅผ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธก์—์„œ ์ผํšŒ์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž„์‹œ ํ…Œ์ด๋ธ”:

CREATE TEMPORARY TABLE tbl(k text, v integer);
...
INSERT INTO tbl(k, v) VALUES($1, $2); -- ะฟะพะฒั‚ะพั€ะธั‚ัŒ ะผะฝะพะณะพ-ะผะฝะพะณะพ ั€ะฐะท
...
-- ั‚ัƒั‚ ะดะตะปะฐะตะผ ั‡ั‚ะพ-ั‚ะพ ะฟะพะปะตะทะฝะพะต ัะพ ะฒัะตะน ัั‚ะพะน ั‚ะฐะฑะปะธั†ะตะน ั†ะตะปะธะบะพะผ

๋ฐฉ๋ฒ•์ด ์ข‹๋‹ค ๋Œ€์šฉ๋Ÿ‰์˜ ๊ฐ„ํ—์ ์ธ ์ „์†ก์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ.
๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์ž„์‹œ ํ…Œ์ด๋ธ”์€ "์ผ๋ฐ˜" ํ…Œ์ด๋ธ”๊ณผ ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. pg_class ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์—์„œ, ๋ฐ c pg_type, pg_depend, pg_attribute, pg_attrdef, ... โ€” ๊ทธ๋ฆฌ๊ณ  ์ „ํ˜€.

๋”ฐ๋ผ์„œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹จ๊ธฐ ์—ฐ๊ฒฐ์ด ๋งŽ์€ ์›น ์‹œ์Šคํ…œ์—์„œ ์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์€ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ๋‹ซํž ๋•Œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, TEMP TABLE์„ ํ†ต์ œํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ฉด pg_catalog์˜ ํ…Œ์ด๋ธ”์ด "ํŒฝ์ฐฝ"ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ์ž‘์—… ์†๋„๊ฐ€ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹ธ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์  ํŒจ์Šค VACUUM FULL ์‹œ์Šคํ…œ ์นดํƒˆ๋กœ๊ทธ ํ…Œ์ด๋ธ”์— ๋”ฐ๋ผ.

์„ธ์…˜ ๋ณ€์ˆ˜

์ด์ „ ์‚ฌ๋ก€์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹จ์ผ SQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜์ง€๋งŒ ์ž์ฃผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ ˆ์ฐจ์  ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. DO ๋ธ”๋ก, ํ•˜์ง€๋งŒ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

๋˜ํ•œ $n ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ต๋ช… ๋ธ”๋ก์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ์…˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚˜๋„๋ก ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค์ •.

๋ฒ„์ „ 9.2 ์ด์ „์—๋Š” ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ˆ˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค custom_variable_classes "์ž์‹ ์˜" ์„ธ์…˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด. ํ˜„์žฌ ๋ฒ„์ „์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SET my.val = '{1,2,3}';
DO $$
DECLARE
  id integer;
BEGIN
  FOR id IN (SELECT unnest(current_setting('my.val')::integer[])) LOOP
    RAISE NOTICE 'id : %', id;
  END LOOP;
END;
$$ LANGUAGE plpgsql;
-- NOTICE:  id : 1
-- NOTICE:  id : 2
-- NOTICE:  id : 3

์ง€์›๋˜๋Š” ๋‹ค๋ฅธ ์ ˆ์ฐจ์  ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ์˜๊ฒฌ์— ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€