PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╕реЗрдЯреНрд╕ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрдгрд┐ SQL рд▓рд╛ рдирд┐рд╡рдбрдгреЗ

рд╡реЗрд│реЛрд╡реЗрд│реА рд╡рд┐рдХрд╛рд╕рдХрд╛рдЪреА рдЧрд░рдЬ рдЕрд╕рддреЗ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪрд╛ рд╕рдВрдЪ рдХрд┐рдВрд╡рд╛ рд╕рдВрдкреВрд░реНрдг рдирд┐рд╡рдб рдкрд╛рд╕ рдХрд░рд╛ "рдкреНрд░рд╡реЗрд╢рджреНрд╡рд╛рд░рд╛рд╡рд░". рдХрдзреА рдХрдзреА рдпрд╛ рд╕рдорд╕реНрдпреЗрд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЦреВрдк рд╡рд┐рдЪрд┐рддреНрд░ рдЙрдкрд╛рдп рд╕рд╛рдкрдбрддрд╛рдд.
PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╕реЗрдЯреНрд╕ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрдгрд┐ SQL рд▓рд╛ рдирд┐рд╡рдбрдгреЗ
рдЪрд▓рд╛ рдорд╛рдЧреЗ рдЬрд╛рдК рдЖрдгрд┐ рдХрд╛рдп рдХрд░реВ рдирдпреЗ, рдХрд╛ рдЖрдгрд┐ рдЖрдкрдг рддреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╕реЗ рдХрд░реВ рд╢рдХрддреЛ рддреЗ рдкрд╛рд╣реВ.

рд╡рд┐рдирдВрддреАрдЪреНрдпрд╛ рдореБрдЦреНрдп рднрд╛рдЧрд╛рдордзреНрдпреЗ рдереЗрдЯ рдореВрд▓реНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ

рд╣реЗ рд╕рд╣рд╕рд╛ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рддреЗ:

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

...рдХрд┐рдВрд╡рд╛ рдпрд╛рд╕рд╛рд░рдЦреЗ:

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

рд╣реА рдкрджреНрдзрдд рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ, рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдЧрджреА рдХрд╛рдврд▓реЗ рднрд░рдкреВрд░:

PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рд╕реЗрдЯреНрд╕ рдкрд╛рд╕ рдХрд░рдгреЗ рдЖрдгрд┐ 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 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗрдд - рдЕрд╕реЗ рдХрд░реВ рдирдХрд╛.

рдЖрдзреАрдЪ рд╡рд╛рдкрд░реВрди рд╡рд┐рдирдВрддреА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣реВ "рджреЛрди-рд╕реНрддрд░реАрдп" рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛:

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 рдкреВрд░реНрд╡реА рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╡рд┐рд╢реЗрд╖ рдиреЗрдорд╕реНрдкреЗрд╕ 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

рдЗрддрд░ рдЙрдкрд╛рдп рдЗрддрд░ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд.

рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрддрд░ рдХрд╛рд╣реА рдорд╛рд░реНрдЧ рдорд╛рд╣рд┐рдд рдЖрд╣реЗрдд рдХрд╛? рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рд╛!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛