
рдХрд▓,
Pavel Stehule рдиреЗ PostgreSQL рдХреЗ рд▓рд┐рдП
SQL / PSM рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо
рдкреВрд░рд╛ рдХрд┐рдпрд╛ред
рдлрд┐рд▓рд╣рд╛рд▓, рднрд╛рд╖рд╛ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ:
- рд╕рд╛рдзрд╛рд░рдг рдЪреАрдЬреЗрдВ - рд╕рд░рдгрд┐рдпрд╛рдБ, рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ (рдХрдВрдкреЛрдЬрд┐рдЯ), рдЯреНрд░рд┐рдЧрд░;
- рдЕрддрд┐рд░рд┐рдХреНрдд - рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, IN / OUT рдкреИрд░рд╛рдореАрдЯрд░;
- SQL / PSM рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ - рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ (рдЬреНрдпрд╛рджрд╛рддрд░ SQLCODE рдкрд░ рдЖрдзрд╛рд░рд┐рдд), SIGNAL рдФрд░ RESIGNAL рдХрдерди;
- DB2 рдФрд░ MySQL рдХреЗ рдХреБрдЫ рдлреАрдЪрд░реНрд╕ рдорд▓реНрдЯреА рдЕрд╕рд╛рдЗрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИрдВ, рдореИрдЬрд┐рдХ рд╡реЗрд░рд┐рдПрдмрд▓ SQLSTATE рдФрд░ SQLCODE рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ рд╣реИрдВред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
рдлрд╝рдВрдХреНрд╢рди test74_2 рдмрдирд╛рдПрдВ рдпрд╛ рдмрджрд▓реЗрдВ ()
$ $ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рда рджреЗрддрд╛ рд╣реИ
рдкрд░рдорд╛рдгреБ рд╢реБрд░реВ рдХрд░реЛ
sqlstate '03000' рдХреЗ рд▓рд┐рдП not_found condition рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ;
not_found рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рдд рд╣реИрдВрдбрд▓рд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
рд╢реБрд░реВ рдХрд░рдирд╛
xx, yy рдЯреЗрдХреНрд╕реНрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ;
рд╕реНрдЯреИрдХ рдХрд┐рдП рдЧрдП рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕ xx = condition_identifier, yy = return_sqlstate;
рд╡рд╛рдкрд╕реА xx || 'рд╕рд┐рдЧреНрдирд▓ рд╕рдВрднрд╛рд▓рд╛' || yy;
рдЕрдВрдд;
рд╕рдВрдХреЗрдд not_found;
рдЕрдВрдд;
$ $ рднрд╛рд╖рд╛ psm0;
$$ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрд╕реНрдЯ 66 (рдПрдХ рдЗрдВрдЯ, рдЖрдЙрдЯ рдЖрд░ рдЗрдВрдЯ) рдмрдирд╛рдПрдВ рдпрд╛ рдмрджрд▓реЗрдВ
рд╢реБрд░реВ рдХрд░рдирд╛
рдШреЛрд╖рдгрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ sqlstate '01002'
рд╕реЗрдЯ рдЖрд░ = рдЖрд░ + 1;
рдШреЛрд╖рдгрд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ sqlstate '01003'
рд╕реЗрдЯ рдЖрд░ = рдЖрд░ + 2;
рд╕реЗрдЯ рдЖрд░ = 0;
x: рдЬрдмрдХрд┐ a> 0 рдХрд░рддреЗ рд╣реИрдВ
рдЕрдЧрд░ рдПрдХ% 2 = 0 рддреЛ
рд╕рдВрдХреЗрдд sqlstate '01002';
рдЕрдиреНрдпрдерд╛
рд╕рдВрдХреЗрдд sqlstate '01003';
рдЕрдВрдд рдЕрдЧрд░;
a = a - 1 рд╕реЗрдЯ рдХрд░реЗрдВ;
рдЬрдмрдХрд┐ рдЕрдВрдд;
рдЕрдВрдд;
$ $ рднрд╛рд╖рд╛ psm0;
рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдореВрд▓
PL / pgSQL рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдкреВрд░реНрдг рд╕рддреНрдпрд╛рдкрди;
- рдиреЗрд╕реНрдЯреЗрдб SQL рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд░реВрдкрд╛рдВрддрд░рдгред
рднрд╛рд╖рд╛ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдиреЗрд╕реНрдЯреЗрдб SQL рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЦреЛрдЬ рд╣реИ - рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрд╕рд╛рдзрд╛рд░рдг рд╣реИред PSM рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрдерд┐рд░ рднрд╛рд╖рд╛ рд╣реИред рдПрдХ рддрд░рдл, рдкреАрдПрд▓ / pgSQL рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЗрд╢рд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░реА рддрд░рдл, PSM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ PL / pgSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдИ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА:
- рдкреВрд░реНрдг рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ - рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрд╡рдпрдВрд╕реЗрд╡рдХ рд╣реИрдВ?
- рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рдиред
- рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдбреАрдмрдЧ рдХрд░рдирд╛ред
рд╕реНрд░реЛрдд рдХреЛрдб
github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рд╣реИред