41.1. ÐÐ±Ð·Ð¾Ñ #
PL/pgSQL ÑÑо пÑоÑедÑÑнÑй ÑзÑк Ð´Ð»Ñ Ð¡Ð£ÐÐ Postgres Pro. ЦелÑÑ Ð¿ÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ PL/pgSQL бÑло Ñоздание загÑÑжаемого пÑоÑедÑÑного ÑзÑка, коÑоÑÑй:
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑий, пÑоÑедÑÑ Ð¸ ÑÑиггеÑов,
добавлÑÐµÑ ÑпÑавлÑÑÑие ÑÑÑÑкÑÑÑÑ Ðº ÑзÑÐºÑ SQL,
Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ ÑложнÑе вÑÑиÑлениÑ,
наÑледÑÐµÑ Ð²Ñе полÑзоваÑелÑÑкие ÑипÑ, ÑÑнкÑии, пÑоÑедÑÑÑ Ð¸ опеÑаÑоÑÑ,
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑеделÑн как довеÑеннÑй ÑзÑк,
пÑоÑÑ Ð² иÑполÑзовании.
ФÑнкÑии PL/pgSQL могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð²ÐµÐ·Ð´Ðµ, где допÑÑÑÐ¸Ð¼Ñ Ð²ÑÑÑоеннÑе ÑÑнкÑии. ÐапÑимеÑ, можно ÑоздаÑÑ ÑÑнкÑии Ñо ÑложнÑми вÑÑиÑлениÑми и ÑÑловной логикой, а заÑем иÑполÑзоваÑÑ Ð¸Ñ Ð¿Ñи опÑеделении опеÑаÑоÑов или в индекÑнÑÑ Ð²ÑÑажениÑÑ .
РвеÑÑии PostgreSQL 9.0 и вÑÑе PL/pgSQL ÑÑÑанавливаеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ. Тем не менее ÑÑо по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð·Ð°Ð³ÑÑжаемÑй модÑÐ»Ñ Ð¸ админиÑÑÑаÑоÑÑ, оÑобо забоÑÑÑиеÑÑ Ð¾ безопаÑноÑÑи, могÑÑ ÑдалиÑÑ ÐµÐ³Ð¾ пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи.
41.1.1. ÐÑеимÑÑеÑÑва иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ PL/pgSQL #
Postgres Pro и болÑÑинÑÑво дÑÑÐ³Ð¸Ñ Ð¡Ð£ÐРиÑполÑзÑÑÑ SQL в каÑеÑÑве ÑзÑка запÑоÑов. SQL Ñ Ð¾ÑоÑо пеÑеноÑим и пÑоÑÑ Ð² изÑÑении. Ðднако каждÑй опеÑаÑÐ¾Ñ SQL вÑполнÑеÑÑÑ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑалÑно на ÑеÑвеÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐÑо знаÑиÑ, ÑÑо ваÑе клиенÑÑкое пÑиложение должно каждÑй запÑÐ¾Ñ Ð¾ÑпÑавлÑÑÑ Ð½Ð° ÑеÑвеÑ, ждаÑÑ Ð¿Ð¾ÐºÐ° он бÑÐ´ÐµÑ Ð¾Ð±ÑабоÑан, полÑÑаÑÑ ÑезÑлÑÑаÑ, делаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе вÑÑиÑлениÑ, заÑем оÑпÑавлÑÑÑ Ð¿Ð¾ÑледÑÑÑие запÑоÑÑ Ð½Ð° ÑеÑвеÑ. ÐÑÑ ÑÑо ÑÑебÑÐµÑ Ð¼ÐµÐ¶Ð¿ÑоÑеÑÑного взаимодейÑÑвиÑ, а Ñакже неÑÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð½Ð° ÑеÑÑ, еÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð¸ ÑеÑÐ²ÐµÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð½Ð° ÑазнÑÑ ÐºÐ¾Ð¼Ð¿ÑÑÑеÑÐ°Ñ .
PL/pgSQL позволÑÐµÑ ÑгÑÑппиÑоваÑÑ Ð±Ð»Ð¾Ðº вÑÑиÑлений и поÑледоваÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов внÑÑÑи ÑеÑвеÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ñаким обÑазом, Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем ÑÐ¸Ð»Ñ Ð¿ÑоÑедÑÑного ÑзÑка и пÑоÑÑоÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SQL пÑи знаÑиÑелÑной Ñкономии накладнÑÑ ÑаÑÑ Ð¾Ð´Ð¾Ð² на клиенÑ-ÑеÑвеÑное взаимодейÑÑвие.
ÐÑклÑÑаÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе обÑаÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом
ÐÑомежÑÑоÑнÑе ненÑжнÑе ÑезÑлÑÑаÑÑ Ð½Ðµ пеÑедаÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑеÑвеÑом и клиенÑом
ÐÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑиÑленнÑÑ ÑазбоÑов одного запÑоÑа
Ð ÑезÑлÑÑаÑе ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº знаÑиÑелÑÐ½Ð¾Ð¼Ñ ÑвелиÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ñиложением, коÑоÑое не иÑполÑзÑÐµÑ Ñ ÑанимÑÑ ÑÑнкÑий.
ÐÑоме Ñого, PL/pgSQL позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð²Ñе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , опеÑаÑоÑÑ Ð¸ ÑÑнкÑии SQL.
41.1.2. ÐоддеÑживаемÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð°ÑгÑменÑов и возвÑаÑаемÑÑ Ð·Ð½Ð°Ñений #
ФÑнкÑии на PL/pgSQL могÑÑ Ð¿ÑинимаÑÑ Ð² каÑеÑÑве аÑгÑменÑов вÑе поддеÑживаемÑе ÑеÑвеÑом ÑкалÑÑнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
или маÑÑÐ¸Ð²Ñ Ð¸ возвÑаÑаÑÑ Ð² каÑеÑÑве ÑезÑлÑÑаÑа лÑбой из ÑÑиÑ
Ñипов. Ðни могÑÑ Ð¿ÑинимаÑÑ Ð¸ возвÑаÑаÑÑ Ð»Ñбой именованнÑй ÑоÑÑавной Ñип (Ñип коÑÑежа). Также еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±ÑÑвиÑÑ ÑÑнкÑÐ¸Ñ Ð½Ð° PL/pgSQL как пÑинимаÑÑÑÑ record, Ñо еÑÑÑ ÐµÐ¹ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑедан лÑбой ÑоÑÑавной Ñип, или как возвÑаÑаÑÑÑÑ record, Ñо еÑÑÑ ÐµÑ ÑезÑлÑÑаÑом бÑÐ´ÐµÑ ÐºÐ¾ÑÑеж, ÑÑолбÑÑ ÐºÐ¾ÑоÑого опÑÐµÐ´ÐµÐ»Ð¸Ñ ÑпеÑиÑикаÑÐ¸Ñ Ð²ÑзÑваÑÑего запÑоÑа, как опиÑано в ÐодÑазделе 7.2.1.4.
ÐÑполÑзование маÑкеÑа VARIADIC позволÑÐµÑ Ð¾Ð±ÑÑвлÑÑÑ ÑÑнкÑии на PL/pgSQL Ñ Ð¿ÐµÑеменнÑм ÑиÑлом аÑгÑменÑов. ÐÑо ÑабоÑÐ°ÐµÑ ÑоÑно Ñак же, как и Ð´Ð»Ñ ÑÑнкÑий на SQL, как опиÑано в ÐодÑазделе 36.5.6.
ФÑнкÑии на PL/pgSQL могÑÑ Ñакже пÑинимаÑÑ Ð¸ возвÑаÑаÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑе ÑипÑ, опиÑаннÑе в ÐодÑазделе 36.2.5, вÑледÑÑвие Ñего ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , обÑабаÑÑваемÑе ÑÑнкÑией, могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¾Ñ Ð²Ñзова к вÑзовÑ. ÐÑимеÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÐодÑазделе 41.3.1.
ФÑнкÑии на PL/pgSQL могÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Â«Ð¼Ð½Ð¾Ð¶ÐµÑÑва» (или ÑаблиÑÑ) лÑбого Ñипа, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð² виде одного обÑекÑа. Такие ÑÑнкÑии генеÑиÑÑÑÑ Ð²Ñвод, вÑполнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ RETURN NEXT Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑезÑлÑÑиÑÑÑÑего набоÑа или RETURN QUERY Ð´Ð»Ñ Ð²Ñвода ÑезÑлÑÑаÑа запÑоÑа.
ÐаконеÑ, пÑи оÑÑÑÑÑÑвии полезного возвÑаÑаемого знаÑÐµÐ½Ð¸Ñ ÑÑнкÑÐ¸Ñ Ð½Ð° PL/pgSQL Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ void. (С дÑÑгой ÑÑоÑонÑ, ÐµÑ Ñакже можно оÑоÑмиÑÑ Ð² виде пÑоÑедÑÑÑ.)
ФÑнкÑии на PL/pgSQL можно обÑÑвиÑÑ Ñ Ð²ÑÑ
однÑми паÑамеÑÑами вмеÑÑо Ñвного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñипа возвÑаÑаемого знаÑениÑ. ÐÑо не добавлÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑÑндаменÑалÑнÑÑ
возможноÑÑей ÑзÑкÑ, но ÑаÑÑо бÑÐ²Ð°ÐµÑ Ñдобно, оÑобенно Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ð¸Ñ Ð½ÐµÑколÑкиÑ
знаÑений. ÐоÑаÑÐ¸Ñ RETURNS TABLE Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð²Ð¼ÐµÑÑо RETURNS SETOF.
ÐонкÑеÑнÑе пÑимеÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð² ÐодÑазделе 41.3.1 и ÐодÑазделе 41.6.1.