DECLARE
DECLARE â опÑеделиÑÑ ÐºÑÑÑоÑ
СинÑакÑиÑ
DECLAREимÑ[ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ] FORquery
ÐпиÑание
ÐпеÑаÑÐ¾Ñ DECLARE позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑоздаваÑÑ ÐºÑÑÑоÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑÑÑ
можно вÑбиÑаÑÑ Ð¿Ð¾ оÑеÑеди некоÑоÑое колиÑеÑÑво ÑÑÑок из ÑезÑлÑÑаÑа болÑÑого запÑоÑа. Ðогда кÑÑÑÐ¾Ñ Ñоздан, ÑеÑез него можно полÑÑаÑÑ ÑÑÑоки, пÑименÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ FETCH.
ÐÑимеÑание
Ðа ÑÑой ÑÑÑаниÑе опиÑÑваеÑÑÑ Ð¿Ñименение кÑÑÑоÑов на ÑÑовне команд SQL. ÐÑли Ð²Ñ Ð¿Ð¾Ð¿ÑÑаеÑеÑÑ Ð¸ÑполÑзоваÑÑ ÐºÑÑÑоÑÑ Ð²Ð½ÑÑÑи ÑÑнкÑии PL/pgSQL, пÑавила бÑдÑÑ Ð´ÑÑгими â Ñм. Раздел 42.7.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемого кÑÑÑоÑа.
BINARYÐÑÑÑÐ¾Ñ Ñ Ñаким ÑвойÑÑвом возвÑаÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе в двоиÑном, а не ÑекÑÑовом ÑоÑмаÑе.
INSENSITIVEУказÑваеÑ, ÑÑо даннÑе, ÑÑиÑÑваемÑе из кÑÑÑоÑа, не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, коÑоÑÑе могÑÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð² нижележаÑÐ¸Ñ ÑаблиÑÐ°Ñ Ð¿Ð¾Ñле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÑÑÑоÑа. Ð PostgreSQL ÑÑо поведение подÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ, Ñак ÑÑо ÑÑо клÑÑевое Ñлово ни на ÑÑо не влиÑÐµÑ Ð¸ пÑинимаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñо ÑÑандаÑÑом SQL.
SCROLLNO SCROLLУказание
SCROLLопÑеделÑеÑ, ÑÑо кÑÑÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑокÑÑÑиваÑÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ полÑÑаÑÑ ÑÑÑоки непоÑледоваÑелÑно (напÑимеÑ, в обÑаÑном поÑÑдке). РзавиÑимоÑÑи Ð¾Ñ ÑложноÑÑи плана запÑоÑа ÑказаниеSCROLLÐ¼Ð¾Ð¶ÐµÑ Ð¾ÑÑиÑаÑелÑно оÑÑазиÑÑÑÑ Ð½Ð° ÑкоÑоÑÑи вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. УказаниеNO SCROLL, напÑоÑив, опÑеделÑеÑ, ÑÑо ÑеÑез кÑÑÑÐ¾Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑÑÑоки в пÑоизволÑном поÑÑдке. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑокÑÑÑка в некоÑоÑÑÑ ÑлÑÑаÑÑ ÑазÑеÑаеÑÑÑ; но ÑÑо не ÑавнознаÑно ÑÑÑекÑÑ ÑказаниÑSCROLL. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐамеÑаниÑ.WITH HOLDWITHOUT HOLDУказание
WITH HOLDопÑеделÑеÑ, ÑÑо кÑÑÑÐ¾Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пÑодолжаÑÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ñле ÑÑпеÑной ÑикÑаÑии ÑоздавÑей его ÑÑанзакÑии.WITHOUT HOLDопÑеделÑеÑ, ÑÑо кÑÑÑÐ¾Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð·Ð° Ñамками ÑÑанзакÑии, ÑоздавÑей его. ÐÑли не Ñказано ниWITHOUT HOLD, ниWITH HOLD, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑWITHOUT HOLD.queryÐоманда SELECT или VALUES, вÑдаÑÑÐ°Ñ ÑÑÑоки, коÑоÑÑе бÑдÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ ÑеÑез кÑÑÑоÑ.
ÐлÑÑевÑе Ñлова BINARY, INSENSITIVE и SCROLL могÑÑ ÑказÑваÑÑÑÑ Ð² лÑбом поÑÑдке.
ÐамеÑаниÑ
ÐбÑÑнÑй кÑÑÑÐ¾Ñ Ð²ÑдаÑÑ Ð´Ð°Ð½Ð½Ñе в ÑекÑÑовом виде, в каком иÑ
вÑдаÑÑ SELECT. Ðднако Ñ Ñказанием BINARY кÑÑÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¸Ñ
и в двоиÑном ÑоÑмаÑе. ÐÑо ÑпÑоÑÐ°ÐµÑ Ð¾Ð¿ÐµÑаÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð´Ð»Ñ ÑеÑвеÑа и клиенÑа, за ÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ
ÑÑилий, ÑÑебÑÑÑиÑ
ÑÑ Ð¾Ñ Ð¿ÑогÑаммиÑÑа Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð»Ð°ÑÑоÑмозавиÑимÑми двоиÑнÑми ÑоÑмаÑами. ÐапÑимеÑ, еÑли запÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение 1 из ÑелоÑиÑленного ÑÑолбÑа, обÑÑнÑй кÑÑÑÐ¾Ñ Ð²ÑдаÑÑ ÑÑÑокÑ, ÑодеÑжаÑÑÑ 1, Ñогда как ÑеÑез двоиÑнÑй кÑÑÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено ÑеÑÑÑÑÑ
байÑовое поле, ÑодеÑжаÑее внÑÑÑеннее пÑедÑÑавление знаÑÐµÐ½Ð¸Ñ (Ñ ÑеÑевÑм поÑÑдком байÑов).
ÐвоиÑнÑе кÑÑÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ñ Ð¾ÑмоÑÑиÑелÑноÑÑÑÑ. Ðногие пÑиложениÑ, в Ñом ÑиÑле psql, не пÑиÑпоÑÐ¾Ð±Ð»ÐµÐ½Ñ Ðº ÑабоÑе Ñ Ð´Ð²Ð¾Ð¸ÑнÑми кÑÑÑоÑами и ожидаÑÑ, ÑÑо даннÑе бÑдÑÑ Ð¿Ð¾ÑÑÑпаÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе.
ÐÑимеÑание
Ðогда клиенÑÑкое пÑиложение вÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ FETCH, иÑполÑзÑÑ Â«ÑаÑÑиÑеннÑй» пÑоÑокол запÑоÑов, в ÑообÑении Bind ÑÑого пÑоÑокола ÑказÑваеÑÑÑ, в каком ÑоÑмаÑе, ÑекÑÑовом или двоиÑном, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñе. ÐÑо Ñказание пеÑеопÑеделÑÐµÑ ÑвойÑÑво кÑÑÑоÑа, заданное в его обÑÑвлении. Таким обÑазом, конÑепÑÐ¸Ñ ÐºÑÑÑоÑа, обÑÑвлÑемого двоиÑнÑм, ÑÑановиÑÑÑ ÑÑÑаÑевÑей пÑи иÑполÑзовании ÑаÑÑиÑенного пÑоÑокола запÑоÑов â лÑбой кÑÑÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑиÑан как ÑекÑÑовÑй или двоиÑнÑй.
ÐÑли в команде обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÑÑÑоÑа не Ñказано WITH HOLD, ÑозданнÑй ей кÑÑÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко в ÑекÑÑей ÑÑанзакÑии. Таким обÑазом, опеÑаÑÐ¾Ñ DECLARE без WITH HOLD беÑполезен вне блока ÑÑанзакÑии: кÑÑÑÐ¾Ñ Ð±ÑÐ´ÐµÑ ÑÑÑеÑÑвоваÑÑ ÑолÑко до завеÑÑÐµÐ½Ð¸Ñ ÑÑого опеÑаÑоÑа. ÐоÑÑÐ¾Ð¼Ñ PostgreSQL ÑообÑÐ°ÐµÑ Ð¾Ð± оÑибке, еÑли ÑÐ°ÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° вÑполнÑеÑÑÑ Ð²Ð½Ðµ блока ÑÑанзакÑии. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð±Ð»Ð¾Ðº ÑÑанзакÑии, пÑимениÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ BEGIN и COMMIT (или ROLLBACK).
ÐÑли в обÑÑвлении кÑÑÑоÑа Ñказано WITH HOLD и ÑÑанзакÑиÑ, ÑоздавÑÐ°Ñ ÐºÑÑÑоÑ, ÑÑпеÑно ÑикÑиÑÑеÑÑÑ, к ÑÑÐ¾Ð¼Ñ ÐºÑÑÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑодолжаÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¿Ð¾ÑледÑÑÑие ÑÑанзакÑии в ÑÑом ÑеанÑе. (Ðо еÑли ÑоздавÑÐ°Ñ ÐºÑÑÑÐ¾Ñ ÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ, кÑÑÑÐ¾Ñ ÑниÑÑожаеÑÑÑ.) ÐÑÑÑÐ¾Ñ Ñо ÑвойÑÑвом WITH HOLD (ÑдеÑживаемÑй) Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÐºÑÑÑ Ñвно, командой CLOSE, либо неÑвно, по завеÑÑении ÑеанÑа. Ð ÑекÑÑей ÑеализаÑии ÑÑÑоки, пÑедÑÑавлÑемÑе ÑдеÑживаемÑм кÑÑÑоÑом, копиÑÑÑÑÑÑ Ð²Ð¾ вÑеменнÑй Ñайл или в облаÑÑÑ Ð¿Ð°Ð¼ÑÑи, Ñак ÑÑо они оÑÑаÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми Ð´Ð»Ñ ÑледÑÑÑиÑ
ÑÑанзакÑий.
ÐбÑÑвиÑÑ ÐºÑÑÑÐ¾Ñ Ñо ÑвойÑÑвом WITH HOLD можно, ÑолÑко еÑли запÑÐ¾Ñ Ð½Ðµ ÑодеÑÐ¶Ð¸Ñ Ñказаний FOR UPDATE и FOR SHARE.
Указание SCROLL добавлÑеÑÑÑ Ð¿Ñи опÑеделении кÑÑÑоÑа, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑбиÑаÑÑ Ð´Ð°Ð½Ð½Ñе в обÑаÑном поÑÑдке. ÐÑо поведение ÑÑебÑеÑÑÑ ÑÑандаÑÑом SQL. Ðднако Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ Ð¿ÑедÑдÑÑими веÑÑиÑми, PostgreSQL допÑÑÐºÐ°ÐµÑ Ð²ÑбоÑÐºÑ Ð² обÑаÑном напÑавлении и без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ SCROLL, еÑли план запÑоÑа кÑÑÑоÑа доÑÑаÑоÑно пÑоÑÑ, ÑÑÐ¾Ð±Ñ ÑеализоваÑÑ Ð¿ÑокÑÑÑÐºÑ Ð½Ð°Ð·Ð°Ð´ без дополниÑелÑнÑÑ
опеÑаÑий. Тем не менее ÑазÑабоÑÑикам пÑиложений не ÑледÑÐµÑ ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо кÑÑÑоÑ, ÑозданнÑй без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ SCROLL, можно бÑÐ´ÐµÑ Ð¿ÑокÑÑÑиваÑÑ Ð½Ð°Ð·Ð°Ð´. С Ñказанием NO SCROLL пÑокÑÑÑка назад запÑеÑаеÑÑÑ Ð² лÑбом ÑлÑÑае.
ÐÑбоÑка в обÑаÑном напÑавлении Ñакже запÑеÑаеÑÑÑ, еÑли запÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR UPDATE и FOR SHARE; в ÑÑом ÑлÑÑае Ñказание SCROLL не пÑинимаеÑÑÑ.
Ðнимание
ÐÑокÑÑÑиваемÑе кÑÑÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÑдаваÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑезÑлÑÑаÑÑ, еÑли они вÑзÑваÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑивÑе ÑÑнкÑии (Ñм. Раздел 37.7). Ðогда повÑоÑно вÑбиÑаеÑÑÑ Ñанее пÑоÑиÑÐ°Ð½Ð½Ð°Ñ ÑÑÑока, ÑÑнкÑии могÑÑ Ð²ÑзÑваÑÑÑÑ Ñнова и вÑдаваÑÑ ÑезÑлÑÑаÑÑ, оÑлиÑнÑе Ð¾Ñ Ð¿Ð¾Ð»ÑÑеннÑÑ
в пеÑвÑй Ñаз. ÐÐ»Ñ Ð·Ð°Ð¿ÑоÑа, вÑзÑваÑÑего изменÑивÑе ÑÑнкÑии, лÑÑÑе вÑего ÑказаÑÑ NO SCROLL. ÐÑли Ñакой ÑпоÑоб не подÑ
одиÑ, дÑÑÐ³Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ð±Ð¾Ð¹Ñи ÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ â обÑÑвиÑÑ ÐºÑÑÑÐ¾Ñ Ñ Ñказанием WITH HOLD и заÑикÑиÑоваÑÑ ÑÑанзакÑиÑ, пÑежде Ñем ÑиÑаÑÑ Ð¸Ð· него какие-либо ÑÑÑоки. Ð ÑÑом ÑлÑÑае веÑÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
кÑÑÑоÑа бÑÐ´ÐµÑ Ð¼Ð°ÑеÑиализован во вÑеменном Ñ
ÑанилиÑе, Ñак ÑÑо изменÑивÑе ÑÑнкÑии бÑдÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки лиÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ.
ÐÑли запÑÐ¾Ñ Ð² опÑеделении кÑÑÑоÑа вклÑÑÐ°ÐµÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR UPDATE или FOR SHARE, возвÑаÑаемÑе кÑÑÑоÑом ÑÑÑоки блокиÑÑÑÑÑÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÐµÑвой вÑбоÑки, Ñак же, как ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи вÑполнении SELECT Ñ ÑÑими ÑказаниÑми. ÐÑоме Ñого, пÑи ÑÑении ÑÑÑок бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð¸Ñ
наиболее акÑÑалÑнÑе веÑÑии; Ñаким обÑазом, Ñ ÑÑими ÑказаниÑми кÑÑÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ ÐºÐ°Ðº «ÑÑвÑÑвиÑелÑнÑй кÑÑÑоÑ», опÑеделÑннÑй в ÑÑандаÑÑе SQL. (УказаÑÑ INSENSITIVE Ð´Ð»Ñ ÐºÑÑÑоÑа Ñ Ð·Ð°Ð¿ÑоÑом FOR UPDATE или FOR SHARE нелÑзÑ.)
Ðнимание
ÐбÑÑно ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ FOR UPDATE, еÑли кÑÑÑÐ¾Ñ Ð¿ÑедназнаÑаеÑÑÑ Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² командаÑ
UPDATE ... WHERE CURRENT OF и DELETE ... WHERE CURRENT OF. Указание FOR UPDATE пÑедоÑвÑаÑÐ°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ ÑÑÑок дÑÑгими ÑеанÑами поÑле Ñого, как они бÑли ÑÑиÑанÑ, и до Ñого, как вÑполниÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°. Ðез FOR UPDATE поÑледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ñ WHERE CURRENT OF не ÑÑабоÑаеÑ, еÑли ÑÑÑока бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÑÑÑоÑа.
ÐÑÑ Ð¾Ð´Ð½Ð° пÑиÑина иÑполÑзоваÑÑ Ñказание FOR UPDATE в Ñом, ÑÑо без него поÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñ WHERE CURRENT OF могÑÑ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли запÑÐ¾Ñ ÐºÑÑÑоÑа не ÑдовлеÑвоÑÑÐµÑ Ð¾Ð³Ð¾Ð²Ð¾ÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð² ÑÑандаÑÑе SQL кÑиÑеÑÐ¸Ñ Â«Ð¿ÑоÑÑой изменÑемоÑÑи» (в ÑаÑÑноÑÑи, кÑÑÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑÑлаÑÑÑÑ ÑолÑко на Ð¾Ð´Ð½Ñ ÑаблиÑÑ Ð¸ не должен иÑполÑзоваÑÑ Ð³ÑÑппиÑÐ¾Ð²ÐºÑ Ð¸ ÑоÑÑиÑÐ¾Ð²ÐºÑ (ORDER BY)). ÐÑÑÑоÑÑ, не ÑдовлеÑвоÑÑÑÑие ÑÑÐ¾Ð¼Ñ ÐºÑиÑеÑиÑ, могÑÑ ÑабоÑаÑÑ Ð»Ð¸Ð±Ð¾ не ÑабоÑаÑÑ, в завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного вÑбÑанного плана; Ñак ÑÑо в Ñ
ÑдÑем ÑлÑÑае пÑиложение Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ð² ÑеÑÑовой, но ÑломаеÑÑÑ Ð² пÑоизводÑÑвенной ÑÑеде. С Ñказанием FOR UPDATE кÑÑÑÐ¾Ñ Ð³Ð°ÑанÑиÑованно бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑемÑм.
Ðе иÑполÑзоваÑÑ Ð¶Ðµ FOR UPDATE Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ Ñ WHERE CURRENT OF в оÑновном Ð¸Ð¼ÐµÐµÑ ÑмÑÑл, ÑолÑко еÑли ÑÑебÑеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿ÑокÑÑÑиваемÑй кÑÑÑÐ¾Ñ Ð¸Ð»Ð¸ кÑÑÑоÑ, не оÑÑажаÑÑий поÑледÑÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (Ñо еÑÑÑ, пÑодолжаÑÑий показÑваÑÑ Ð¿Ñежние даннÑе). ÐÑли ÑÑо дейÑÑвиÑелÑно необÑ
одимо, обÑзаÑелÑно ÑÑÑиÑе пÑи ÑеализаÑии пÑиведÑннÑе вÑÑе замеÑаниÑ.
Ð ÑÑандаÑÑе SQL меÑ
анизм кÑÑÑоÑов пÑедÑÑмоÑÑен ÑолÑко Ð´Ð»Ñ Ð²ÑÑÑаиваемого SQL. СеÑÐ²ÐµÑ PostgreSQL не ÑеализÑÐµÑ Ð´Ð»Ñ ÐºÑÑÑоÑов опеÑаÑÐ¾Ñ OPEN; кÑÑÑÐ¾Ñ ÑÑиÑаеÑÑÑ Ð¾ÑкÑÑÑÑм пÑи обÑÑвлении. Ðднако ECPG, вÑÑÑаиваемÑй пÑепÑоÑеÑÑÐ¾Ñ SQL Ð´Ð»Ñ PostgreSQL, ÑледÑÐµÑ ÑоглаÑениÑм ÑÑандаÑÑа, в Ñом ÑиÑле поддеÑÐ¶Ð¸Ð²Ð°Ñ Ð´Ð»Ñ ÐºÑÑÑоÑов опеÑаÑоÑÑ DECLARE и OPEN.
ÐолÑÑиÑÑ ÑпиÑок вÑеÑ
доÑÑÑпнÑÑ
кÑÑÑоÑов можно, обÑаÑивÑиÑÑ Ðº ÑиÑÑÐµÐ¼Ð½Ð¾Ð¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ pg_cursors.
ÐÑимеÑÑ
ÐбÑÑвление кÑÑÑоÑа:
DECLARE liahona CURSOR FOR SELECT * FROM films;
ÐÑÑгие пÑимеÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑÑÑоÑа можно найÑи в FETCH.
СовмеÑÑимоÑÑÑ
Ð ÑÑандаÑÑе SQL говоÑиÑÑÑ, ÑÑо ÑÑвÑÑвиÑелÑноÑÑÑ ÐºÑÑÑоÑов к паÑаллелÑÐ½Ð¾Ð¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑиÑ
даннÑÑ
по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ ÑеализаÑией. Ð PostgreSQL кÑÑÑоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð½ÐµÑÑвÑÑвиÑелÑнÑе, а ÑÑвÑÑвиÑелÑнÑми иÑ
можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ FOR UPDATE. ÐÑÑгие СУÐРмогÑÑ ÑабоÑаÑÑ Ð¸Ð½Ð°Ñе.
СÑандаÑÑ SQL допÑÑÐºÐ°ÐµÑ ÐºÑÑÑоÑÑ ÑолÑко во вÑÑÑаиваемом SQL и в модÑлÑÑ . PostgreSQL позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÑÑÑоÑÑ Ð¸Ð½ÑеÑакÑивно.
ÐвоиÑнÑе кÑÑÑоÑÑ ÑвлÑÑÑÑÑ ÑаÑÑиÑением PostgreSQL.