рд╡реЗрд│реЛрд╡реЗрд│реА рд╡рд┐рдХрд╛рд╕рдХрд╛рдЪреА рдЧрд░рдЬ рдЕрд╕рддреЗ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪрд╛ рд╕рдВрдЪ рдХрд┐рдВрд╡рд╛ рд╕рдВрдкреВрд░реНрдг рдирд┐рд╡рдб рдкрд╛рд╕ рдХрд░рд╛ "рдкреНрд░рд╡реЗрд╢рджреНрд╡рд╛рд░рд╛рд╡рд░". рдХрдзреА рдХрдзреА рдпрд╛ рд╕рдорд╕реНрдпреЗрд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЦреВрдк рд╡рд┐рдЪрд┐рддреНрд░ рдЙрдкрд╛рдп рд╕рд╛рдкрдбрддрд╛рдд.
рдЪрд▓рд╛ рдорд╛рдЧреЗ рдЬрд╛рдК рдЖрдгрд┐ рдХрд╛рдп рдХрд░реВ рдирдпреЗ, рдХрд╛ рдЖрдгрд┐ рдЖрдкрдг рддреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╕реЗ рдХрд░реВ рд╢рдХрддреЛ рддреЗ рдкрд╛рд╣реВ.
рд╡рд┐рдирдВрддреАрдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рдордзреНрдпреЗ рдереЗрдЯ рдореВрд▓реНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ
рд╣реЗ рд╕рд╣рд╕рд╛ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рддреЗ:
query = "SELECT * FROM tbl WHERE id = " + value
...рдХрд┐рдВрд╡рд╛ рдпрд╛рд╕рд╛рд░рдЦреЗ:
query = "SELECT * FROM tbl WHERE id = :param".format(param=value)
рд╣реА рдкрджреНрдзрдд рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐
рдЬрд╡рд│рдЬрд╡рд│ рдиреЗрд╣рдореАрдЪ рд╣реЗ рдЕрд╕рддреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдЗрдВрдЬреЗрдХреНрд╢рдиреНрд╕рдЪрд╛ рдереЗрдЯ рдорд╛рд░реНрдЧ рдЖрдгрд┐ рдмрд┐рдЭрдиреЗрд╕ рд▓реЙрдЬрд┐рдХрд╡рд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрд╛рд░, рдЬреНрдпрд╛рд▓рд╛ рддреБрдордЪреА рдХреНрд╡реЗрд░реА рд▓рд╛рдЗрди "рдЧреЛрдВрдж" рдХрд░рдгреНрдпрд╛рд╕ рднрд╛рдЧ рдкрд╛рдбрд▓реЗ рдЬрд╛рддреЗ.
рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕рдЪ рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рдЕрдВрд╢рддрдГ рдиреНрдпрд╛рдпреНрдп рдард░реВ рд╢рдХрддреЛ рд╡рд┐рднрд╛рдЬрди рд╡рд╛рдкрд░рдгреЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдпреЛрдЬрдирд╛ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА 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 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗрдд - рдЕрд╕реЗ рдХрд░реВ рдирдХрд╛.
рдЖрдзреАрдЪ рд╡рд╛рдкрд░реВрди рд╡рд┐рдирдВрддреА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣реВ "рджреЛрди-рд╕реНрддрд░реАрдп" рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛:
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;
рд╣реЛрдп, рдЕреЕрд░реЗрдордзреАрд▓ "рдЬрдЯрд┐рд▓" рдореВрд▓реНрдпрд╛рдВрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рддреЗ рдЕрд╡рддрд░рдгрд╛рдВрдиреА рд╡реЗрдврд▓реЗрд▓реЗ рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд.
рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдкрдг рдлреАрд▓реНрдбрдЪреНрдпрд╛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдВрдЦреНрдпреЗрд╕рд╣ рдирд┐рд╡рдб "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░реВ рд╢рдХрддрд╛.
unnest, uncest, тАж
рд╡реЗрд│реЛрд╡реЗрд│реА "рдЕтАНреЕрд░реЗ рдСрдл рдЕтАНреЕрд░реЗ" рдРрд╡рдЬреА рдореА рдирдореВрдж рдХреЗрд▓реЗрд▓реНрдпрд╛ "рдХреЙрд▓рдордЪреЗ рдЕреЕрд░реЗ" рдРрд╡рдЬреА рдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рдЪреЗ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд.
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 рдкреНрд░рдХрд╛рд░рд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд. рдореНрд╣рдгреВрди, рдЗрдирдкреБрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рддреБрдордЪреНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЖрдврд│рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рддреЗ рддрд┐рдереЗрдЪ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реАрд╕рд╛рдареА json рдСрдмреНрдЬреЗрдХреНрдЯ:
SELECT
key k
, value v
FROM
json_each($1::json); -- '{"a":1,"b":2,"c":3,"d":4}'
рдорд╛рдЧреАрд▓ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрд╕рд╛рдареА, рд╕рдорд╛рди рдкрджреНрдзрдд рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдкреНрд░рддреНрдпреЗрдХ (hstore), рдкрд░рдВрддреБ hstore рдордзреАрд▓ рдЧреБрдВрддрд╛рдЧреБрдВрддреАрдЪреНрдпрд╛ рд╡рд╕реНрддреВ рдмрд╛рд╣реЗрд░ рдХрд╛рдврдгреНрдпрд╛рд╕рд╛рдареА рдпреЛрдЧреНрдп "Convolution" рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВ рд╢рдХрддрд╛рдд.
json_populate_recordset
рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЕрд╕реЗрд▓ рдХреА "рдЗрдирдкреБрдЯ" json рдЕреЕрд░реЗрдордзреАрд▓ рдбреЗрдЯрд╛ рдХрд╛рд╣реА рдЯреЗрдмрд▓ рднрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдИрд▓, рддрд░ рддреБрдореНрд╣реА json_populate_recordset рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди "dereferencing" рдлреАрд▓реНрдбрдордзреНрдпреЗ рдЦреВрдк рдмрдЪрдд рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░рд╛рдВрдордзреНрдпреЗ рдХрд╛рд╕реНрдЯ рдХрд░реВ рд╢рдХрддрд╛:
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 рд╕рд┐рд╕реНрдЯрдо рдЯреЗрдмрд▓рдордзреНрдпреЗ, рдЖрдгрд┐ рдордзреНрдпреЗ pg_type, pg_depend, pg_attribute, pg_attrdef, ... - рдЕрдЬрд┐рдмрд╛рдд рдирд╛рд╣реА.
рдореНрд╣рдгреВрди, рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдЕрд▓реНрдкрд╛рдпреБрд╖реА рдХрдиреЗрдХреНрд╢рди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реЗрдм рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ, рдЕрд╢реА рд╕рд╛рд░рдгреА рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдирд╡реАрди рд╕рд┐рд╕реНрдЯрдо рд░реЗрдХреЙрд░реНрдб рддрдпрд╛рд░ рдХрд░реЗрд▓, рдЬреЗ рдбреЗрдЯрд╛рдмреЗрд╕рд╢реА рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХреЗрд▓реНрдпрд╛рд╡рд░ рд╣рдЯрд╡рд▓реЗ рдЬрд╛рддрд╛рдд. рдЕрдЦреЗрд░реАрд╕, TEMP TABLE рдЪрд╛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд╛рдкрд░ pg_catalog рдордзреАрд▓ рдЯреЗрдмрд▓рд╛рдВрдирд╛ "рд╕реВрдЬ" рдиреЗрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рдгрд╛рд▒реНрдпрд╛ рдЕрдиреЗрдХ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрдореА рдХрд░рдгреЗ.
рдЕрд░реНрдерд╛рдд, рд╣реЗ рд╡рд╛рдкрд░реВрди рд╣рд╛рддрд╛рд│рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдирд┐рдпрддрдХрд╛рд▓рд┐рдХ рд░рд╕реНрддрд╛ рд╡реНрд╣реЕрдХреНрдпреВрдо рдкреВрд░реНрдг рд╕рд┐рд╕реНрдЯрдо рдХреЕрдЯрд▓реЙрдЧ рд╕рд╛рд░рдгреНрдпрд╛рдВрдиреБрд╕рд╛рд░.
рд╕рддреНрд░ рдЪрд▓
рдЪрд▓рд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рдХреА рдорд╛рдЧреАрд▓ рдХреЗрд╕рдордзреАрд▓ рдбреЗрдЯрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдПрдХрд╛ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реАрд╕рд╛рдареА рдЦреВрдк рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдмрд░реЗрдЪрджрд╛ рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ. рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдореНрд╣реА рдордзреНрдпреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ
рдирд┐рдирд╛рд╡реА рдмреНрд▓реЙрдХрд▓рд╛ рдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА $n-рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА. рд╕рддреНрд░ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЖрдгрд┐ рдлрдВрдХреНрд╢рди рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрддреВрди рдмрд╛рд╣реЗрд░ рдкрдбрдгреНрдпрд╛рд╕ рдорджрдд рдХрд░рддреАрд▓ рдЪрд╛рд▓реВ_рд╕реЗрдЯрд┐рдВрдЧ.
рдЖрд╡реГрддреНрддреА 9.2 рдкреВрд░реНрд╡реА рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ
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
рдЗрддрд░ рдЙрдкрд╛рдп рдЗрддрд░ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд.
рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрддрд░ рдХрд╛рд╣реА рдорд╛рд░реНрдЧ рдорд╛рд╣рд┐рдд рдЖрд╣реЗрдд рдХрд╛? рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рд╛!
рд╕реНрддреНрд░реЛрдд: www.habr.com