CREATE FUNCTION
CREATE FUNCTION â ÑоздаÑÑ ÑÑнкÑиÑ
СинÑакÑиÑ
CREATE [ OR REPLACE ] FUNCTION
Ð¸Ð¼Ñ ( [ [ Ñежим_аÑгÑменÑа ] [ имÑ_аÑгÑменÑа ] Ñип_аÑгÑменÑа [ { DEFAULT | = } вÑÑажение_по_ÑмолÑÐ°Ð½Ð¸Ñ ] [, ...] ] )
[ RETURNS Ñип_ÑезÑлÑÑаÑа
| RETURNS TABLE ( имÑ_ÑÑолбÑа Ñип_ÑÑолбÑа [, ...] ) ]
{ LANGUAGE имÑ_ÑзÑка
| TRANSFORM { FOR TYPE имÑ_Ñипа } [, ... ]
| WINDOW
| IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| COST ÑÑоимоÑÑÑ_вÑполнениÑ
| ROWS ÑÑÑок_в_ÑезÑлÑÑаÑе
| SET паÑамеÑÑ_конÑигÑÑаÑии { TO знаÑение | = знаÑение | FROM CURRENT }
| AS 'опÑеделение'
| AS 'обÑекÑнÑй_Ñайл', 'обÑекÑнÑй_Ñимвол'
} ...
[ WITH ( аÑÑибÑÑ [, ...] ) ]ÐпиÑание
Ðоманда CREATE FUNCTION опÑеделÑÐµÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ. CREATE OR REPLACE FUNCTION ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ, либо заменÑÐµÑ Ð¾Ð¿Ñеделение Ñже ÑÑÑеÑÑвÑÑÑей. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑÑнкÑиÑ, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑего ÑзÑка.
ÐÑли Ñказано Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ, ÑÑнкÑÐ¸Ñ ÑоздаÑÑÑÑ Ð² заданной ÑÑ ÐµÐ¼Ðµ, в пÑоÑивном ÑлÑÑае â в ÑекÑÑей. ÐÐ¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑÑнкÑии должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÑнкÑий Ñ Ñакими же Ñипами аÑгÑменÑов в ÑÑой ÑÑ ÐµÐ¼Ðµ. Ðднако ÑÑнкÑии Ñ Ð°ÑгÑменÑами ÑазнÑÑ Ñипов могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¾ Ð¸Ð¼Ñ (ÑÑо назÑваеÑÑÑ Ð¿ÐµÑегÑÑзкой).
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑекÑÑее опÑеделение ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии, иÑполÑзÑйÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE OR REPLACE FUNCTION. Ðо ÑÑÑиÑе, ÑÑо она не позволÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ аÑгÑменÑÑ ÑÑнкÑии (еÑли попÑÑаÑÑÑÑ ÑделаÑÑ ÑÑо, на Ñамом деле бÑÐ´ÐµÑ Ñоздана новаÑ, незавиÑÐ¸Ð¼Ð°Ñ ÑÑнкÑиÑ). ÐÑоме Ñого, CREATE OR REPLACE FUNCTION не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ñип ÑезÑлÑÑаÑа ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии. ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо, пÑидÑÑÑÑ ÑдалиÑÑ ÑÑнкÑÐ¸Ñ Ð¸ ÑоздаÑÑ ÐµÑ Ð·Ð°Ð½Ð¾Ð²Ð¾. (ÐÑо ознаÑаеÑ, ÑÑо еÑли ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ Ð²ÑÑ
однÑе паÑамеÑÑÑ (OUT), Ñо измениÑÑ ÑÐ¸Ð¿Ñ Ð¿Ð°ÑамеÑÑов OUT можно, ÑолÑко Ñдалив ÑÑнкÑиÑ.)
Ðогда команда CREATE OR REPLACE FUNCTION заменÑÐµÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑÑнкÑиÑ, Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¸ пÑава доÑÑÑпа к ÑÑой ÑÑнкÑии не менÑÑÑÑÑ. ÐÑе дÑÑгие ÑвойÑÑва ÑÑнкÑии полÑÑаÑÑ Ð·Ð½Ð°ÑениÑ, задаваемÑе командой Ñвно или по ÑмолÑаниÑ. ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑÑнкÑиÑ, необÑ
одимо бÑÑÑ ÐµÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем (или бÑÑÑ Ñленом Ñоли-владелÑÑа).
ÐÑли Ð²Ñ ÑдалиÑе и заÑем Ð²Ð½Ð¾Ð²Ñ ÑоздадиÑе ÑÑнкÑиÑ, Ð½Ð¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð½ÐµÑ Ð´ÑÑгой ÑÑÑноÑÑÑÑ, оÑлиÑной Ð¾Ñ ÑÑаÑой; вам поÑÑебÑеÑÑÑ Ñак же ÑдалиÑÑ ÑÑÑеÑÑвÑÑÑие пÑавила, пÑедÑÑавлениÑ, ÑÑиггеÑÑ Ð¸ Ñ. п., ÑÑÑлаÑÑиеÑÑ Ð½Ð° ÑÑаÑÑÑ ÑÑнкÑиÑ. ÐоÑÑомÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð¿Ñеделение ÑÑнкÑии, ÑоÑ
ÑанÑÑ ÑÑÑлаÑÑиеÑÑ Ð½Ð° Ð½ÐµÑ Ð¾Ð±ÑекÑÑ, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ CREATE OR REPLACE FUNCTION. ÐÑоме Ñого, многие дополниÑелÑнÑе ÑвойÑÑва ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии можно измениÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ALTER FUNCTION.
ÐладелÑÑем ÑÑнкÑии ÑÑановиÑÑÑ ÑоздавÑий ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑнкÑиÑ, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ñипов ÐµÑ Ð°ÑгÑменÑов и возвÑаÑаемого Ñипа.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемой ÑÑнкÑии (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
Ñежим_аÑгÑменÑаРежим аÑгÑменÑа:
IN(Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹),OUT(вÑÑ Ð¾Ð´Ð½Ð¾Ð¹),INOUT(Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ и вÑÑ Ð¾Ð´Ð½Ð¾Ð¹) илиVARIADIC(пеÑеменнÑй). Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑIN. Ðа единÑÑвеннÑм аÑгÑменÑомVARIADICмогÑÑ ÑледоваÑÑ ÑолÑко аÑгÑменÑÑOUT. ÐÑоме Ñого, аÑгÑменÑÑOUTиINOUTнелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ñ Ð¿ÑедложениемRETURNS TABLE.имÑ_аÑгÑменÑаÐÐ¼Ñ Ð°ÑгÑменÑа. ÐекоÑоÑÑе ÑзÑки (вклÑÑÐ°Ñ SQL и PL/pgSQL) позволÑÑÑ Ð¸ÑполÑзоваÑÑ ÑÑо Ð¸Ð¼Ñ Ð² Ñеле ÑÑнкÑии. ÐÐ»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑзÑков ÑÑо Ð¸Ð¼Ñ ÑлÑÐ¶Ð¸Ñ Ð¿ÑоÑÑо дополниÑелÑнÑм опиÑанием, еÑли говоÑиÑÑ Ð¾ Ñамой ÑÑнкÑии; однако Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑказÑваÑÑ Ð¸Ð¼ÐµÐ½Ð° аÑгÑменÑов пÑи вÑзове ÑÑнкÑии Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑиÑаемоÑÑи (Ñм. Раздел 4.3). ÐÐ¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ аÑгÑменÑа в лÑбом ÑлÑÑае Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñак как оно опÑеделÑÐµÑ Ð¸Ð¼Ñ ÑÑолбÑа в Ñипе ÑезÑлÑÑаÑа. (ÐÑли Ð²Ñ Ð¾Ð¿ÑÑÑиÑе Ð¸Ð¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ аÑгÑменÑа, ÑиÑÑема вÑбеÑÐµÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ð¸Ð¼Ñ Ð¿Ð¾ ÑмолÑаниÑ.)
Ñип_аÑгÑменÑаТип даннÑÑ Ð°ÑгÑменÑа ÑÑнкÑии (возможно, дополненнÑй ÑÑ ÐµÐ¼Ð¾Ð¹), пÑи налиÑии аÑгÑменÑов. Тип аÑгÑменÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñм, ÑоÑÑавнÑм или доменнÑм, либо ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑлка на ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ.
РзавиÑимоÑÑи Ð¾Ñ ÑзÑка ÑеализаÑии Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Ñказание «пÑевдоÑипов», напÑимеÑ,
cstring. ÐÑевдоÑÐ¸Ð¿Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ, ÑÑо ÑакÑиÑеÑкий Ñип аÑгÑменÑа либо опÑеделÑн не полноÑÑÑÑ, либо ÑÑÑеÑÑвÑÐµÑ Ð²Ð½Ðµ множеÑÑва обÑÑнÑÑ Ñипов SQL.СÑÑлка на Ñип ÑÑолбÑа запиÑÑваеÑÑÑ Ð² виде
. Ðногда Ñакое Ñказание бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, Ñак как позволÑÐµÑ ÑоздаÑÑ ÑÑнкÑиÑ, незавиÑÑÑÑÑ Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в опÑеделении ÑаблиÑÑ.имÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа%TYPEвÑÑажение_по_ÑмолÑаниÑÐÑÑажение, иÑполÑзÑемое Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, еÑли паÑамеÑÑ Ð½Ðµ задан Ñвно. РезÑлÑÑÐ°Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑводиÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ ÑооÑвеÑÑÑвÑÑÑего паÑамеÑÑа. ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð¼ÐµÑÑ ÑолÑко Ð²Ñ Ð¾Ð´Ð½Ñе паÑамеÑÑÑ (вклÑÑаÑ
INOUT). ÐÐ»Ñ Ð²ÑÐµÑ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов, ÑледÑÑÑÐ¸Ñ Ð·Ð° паÑамеÑÑом Ñ Ð¾Ð¿ÑеделÑннÑм знаÑением по ÑмолÑаниÑ, Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.Ñип_ÑезÑлÑÑаÑаТип возвÑаÑаемÑÑ Ð´Ð°Ð½Ð½ÑÑ (возможно, дополненнÑй ÑÑ ÐµÐ¼Ð¾Ð¹). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй, ÑоÑÑавной или доменнÑй Ñип, либо ÑÑÑлка на Ñип ÑÑолбÑа ÑаблиÑÑ. РзавиÑимоÑÑи Ð¾Ñ ÑзÑка ÑеализаÑии здеÑÑ Ñакже могÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Â«Ð¿ÑевдоÑипÑ», напÑимеÑ
cstring. ÐÑли ÑÑнкÑÐ¸Ñ Ð½Ðµ должна возвÑаÑаÑÑ Ð·Ð½Ð°Ñение, в каÑеÑÑве Ñипа ÑезÑлÑÑаÑа ÑказÑваеÑÑÑvoid.Ð ÑлÑÑае налиÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов
OUTилиINOUT, пÑедложениеRETURNSможно опÑÑÑиÑÑ. ÐÑли оно пÑиÑÑÑÑÑвÑеÑ, оно должно ÑоглаÑовÑваÑÑÑÑ Ñ Ñипом ÑезÑлÑÑаÑа, вÑводимÑм из вÑÑ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов: в каÑеÑÑве возвÑаÑаемого Ñипа ÑказÑваеÑÑÑRECORD, еÑли вÑÑ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов неÑколÑко, либо Ñип единÑÑвенного вÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ паÑамеÑÑа.Указание
SETOFпоказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, а не единÑÑвеннÑй ÑлеменÑ.СÑÑлка на Ñип ÑÑолбÑа запиÑÑваеÑÑÑ Ð² виде
.имÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа%TYPEимÑ_ÑÑолбÑаÐÐ¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа в запиÑи
RETURNS TABLE. Ðо ÑÑÑи ÑÑо еÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб обÑÑвиÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ паÑамеÑÑ (OUT), ноRETURNS TABLEÑакже подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð¸RETURNS SETOF.Ñип_ÑÑолбÑаТип даннÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа в запиÑи
RETURNS TABLE.имÑ_ÑзÑкаÐÐ¼Ñ ÑзÑка, на коÑоÑом Ñеализована ÑÑнкÑиÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
sql,c,internal, либо Ð¸Ð¼Ñ Ð¿ÑоÑедÑÑного ÑзÑка, опÑеделÑнного полÑзоваÑелем, напÑимеÑ,plpgsql. СÑÐ¸Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑого имени в апоÑÑÑоÑÐ°Ñ ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим и ÑÑебÑÐµÑ ÑоÑного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÑегиÑÑÑа.TRANSFORM { FOR TYPEимÑ_Ñипа} [, ... ] }УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑпиÑок ÑÑанÑÑоÑмаÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ð¿Ñи вÑзове ÑÑнкÑии. ТÑанÑÑоÑмаÑии вÑполнÑÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñипами SQL и Ñипами даннÑÑ , ÑпеÑиÑиÑнÑми Ð´Ð»Ñ ÑзÑков; Ñм. CREATE TRANSFORM. ÐÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑÑÑоеннÑÑ Ñипов обÑÑно жÑÑÑко пÑедопÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑеализаÑиÑÑ Ð¿ÑоÑедÑÑнÑÑ ÑзÑков, Ñак ÑÑо Ð¸Ñ Ð·Ð´ÐµÑÑ ÑказÑваÑÑ Ð½Ðµ нÑжно. ÐÑли ÑеализаÑÐ¸Ñ Ð¿ÑоÑедÑÑного ÑзÑка не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабоÑаÑÑ Ñип и ÑÑанÑÑоÑмаÑÐ¸Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ оÑÑÑÑÑÑвÑеÑ, бÑÐ´ÐµÑ Ð²Ñполнено пÑеобÑазование Ñипов по ÑмолÑаниÑ, но ÑÑо завиÑÐ¸Ñ Ð¾Ñ ÑеализаÑии.
WINDOWУказание
WINDOWпоказÑваеÑ, ÑÑо ÑоздаÑÑÑÑ Ð½Ðµ пÑоÑÑаÑ, а Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ ÑÑнкÑиÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑолÑко Ð´Ð»Ñ ÑÑнкÑий, напиÑаннÑÑ Ð½Ð° C. ÐÑÑибÑÑWINDOWнелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ, модиÑиÑиÑÑÑ Ð²Ð¿Ð¾ÑледÑÑвии опÑеделение ÑÑнкÑии.IMMUTABLESTABLEVOLATILEÐÑи аÑÑибÑÑÑ Ð¸Ð½ÑоÑмиÑÑÑÑ Ð¾Ð¿ÑимизаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑов о поведении ÑÑнкÑии. ÐдновÑеменно можно ÑказаÑÑ Ð½Ðµ более одного аÑÑибÑÑа. ÐÑли никакой аÑÑибÑÑ Ð½Ðµ задан, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ
VOLATILE.ХаÑакÑеÑиÑÑика
IMMUTABLE(поÑÑоÑннаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ вÑегда возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¿Ñи опÑеделÑннÑÑ Ð·Ð½Ð°ÑениÑÑ Ð°ÑгÑменÑов; Ñо еÑÑÑ, она не обÑаÑаеÑÑÑ Ðº базе даннÑÑ Ð¸ не иÑполÑзÑÐµÑ Ð¸Ð½ÑоÑмаÑиÑ, не пеÑеданнÑÑ ÐµÐ¹ Ñвно в ÑпиÑке аÑгÑменÑов. ÐÑли ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ ÑакÑÑ Ñ Ð°ÑакÑеÑиÑÑикÑ, лÑбой ÐµÑ Ð²Ñзов Ñ Ð°ÑгÑменÑами-конÑÑанÑами можно немедленно замениÑÑ Ð·Ð½Ð°Ñением ÑÑнкÑии.ХаÑакÑеÑиÑÑика
STABLE(ÑÑабилÑнаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ в ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð¾Ð½Ð° вÑегда возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑннÑÑ Ð·Ð½Ð°Ñений аÑгÑменÑов, но ÑÑÐ¾Ñ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазнÑм в ÑазнÑÑ Ð¾Ð¿ÐµÑаÑоÑÐ°Ñ SQL. ÐÑо Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий вÑÐ±Ð¾Ñ Ð´Ð»Ñ ÑÑнкÑий, ÑезÑлÑÑаÑÑ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÑÑ Ð¾Ñ ÑодеÑжимого Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ наÑÑÑаиваемÑÑ Ð¿Ð°ÑамеÑÑов (напÑимеÑ, ÑекÑÑего ÑаÑового поÑÑа). (Ðо ÑÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑÑиггеÑовAFTER, желаÑÑÐ¸Ñ Ð¿ÑоÑиÑаÑÑ ÑÑÑоки, изменÑннÑе ÑекÑÑей командой.) Также замеÑÑÑе, ÑÑо ÑÑнкÑии ÑемейÑÑваcurrent_timestampÑакже ÑÑиÑаÑÑÑÑ ÑÑабилÑнÑми, Ñак как Ð¸Ñ ÑезÑлÑÑаÑÑ Ð½Ðµ менÑÑÑÑÑ Ð²Ð½ÑÑÑи ÑÑанзакÑии.ХаÑакÑеÑиÑÑика
VOLATILE(изменÑиваÑ) показÑваеÑ, ÑÑо ÑезÑлÑÑÐ°Ñ ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð´Ð°Ð¶Ðµ в ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, Ñак ÑÑо ÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¾Ð¿ÑимизиÑоваÑÑ. ÐзменÑÐ¸Ð²Ñ Ð² ÑÑом ÑмÑÑле оÑноÑиÑелÑно немногие ÑÑнкÑии баз даннÑÑ , напÑимеÑ:random(),currval()иtimeofday(). Ðо замеÑÑÑе, ÑÑо лÑÐ±Ð°Ñ ÑÑнкÑÐ¸Ñ Ñ Ð¿Ð¾Ð±Ð¾ÑнÑми ÑÑÑекÑами должна бÑÑÑ ÐºÐ»Ð°ÑÑиÑиÑиÑована как изменÑиваÑ, даже еÑли ÐµÑ ÑезÑлÑÑÐ°Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ пÑедÑказÑем, ÑÑÐ¾Ð±Ñ ÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð½Ðµ бÑли ÑопÑимизиÑованÑ; пÑÐ¸Ð¼ÐµÑ Ñакой ÑÑнкÑии:setval().Ðа дополниÑелÑнÑми подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 35.6.
LEAKPROOFХаÑакÑеÑиÑÑика
LEAKPROOF(геÑмеÑиÑнаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð±Ð¾ÑнÑÑ ÑÑÑекÑов. Ðна не ÑаÑкÑÑÐ²Ð°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÐ²Ð¾Ð¸Ñ Ð°ÑгÑменÑÐ°Ñ , кÑоме как возвÑаÑÐ°Ñ ÑезÑлÑÑаÑ. ÐапÑимеÑ, ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑдаÑÑ ÑообÑение об оÑибке Ñ Ð½ÐµÐºÐ¾ÑоÑÑми, но не вÑеми знаÑениÑми аÑгÑменÑов, либо вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов в ÑообÑении об оÑибке, не ÑвлÑеÑÑÑ Ð³ÐµÑмеÑиÑной. ÐÑо влиÑÐµÑ Ð½Ð° Ñо, как ÑиÑÑема вÑполнÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ðº пÑедÑÑавлениÑм, ÑозданнÑм Ñ Ð±Ð°ÑÑеÑом безопаÑноÑÑи (Ñ Ñказаниемsecurity_barrier), или к ÑаблиÑам Ñ Ð²ÐºÐ»ÑÑÑнной заÑиÑой ÑÑÑок. Ðо избежание неконÑÑолиÑÑемой ÑÑеÑки даннÑÑ ÑиÑÑема бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð· полиÑик заÑиÑÑ Ð¸ опÑеделений пÑедÑÑавлений Ñ Ð±Ð°ÑÑеÑами безопаÑноÑÑи пеÑед лÑбÑми ÑÑловиÑми, коÑоÑÑе задаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð² Ñамом запÑоÑе и в коÑоÑÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвÑÑÑÑÑ Ð½ÐµÐ³ÐµÑмеÑиÑнÑе ÑÑнкÑии. ФÑнкÑии и опеÑаÑоÑÑ, помеÑеннÑе как геÑмеÑиÑнÑе, ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð²ÐµÑеннÑми и могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿ÐµÑед ÑÑловиÑми из полиÑик заÑиÑÑ Ð¸ пÑедÑÑавлений Ñ Ð±Ð°ÑÑеÑами безопаÑноÑÑи. ÐÑи ÑÑом ÑÑнкÑии, коÑоÑÑе не имеÑÑ Ð°ÑгÑменÑов или коÑоÑÑм не пеÑедаÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ аÑгÑменÑÑ Ð¸Ð· пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð±Ð°ÑÑеÑом безопаÑноÑÑи или ÑаблиÑÑ, не ÑÑебÑеÑÑÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÐºÐ°Ðº геÑмеÑиÑнÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ вÑполнÑлиÑÑ Ð´Ð¾ ÑÑловий, ÑвÑзаннÑÑ Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑÑÑ. См. CREATE VIEW и Раздел 38.5. ÐÑо ÑвойÑÑво Ð¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ ÑолÑко ÑÑпеÑполÑзоваÑелÑ.CALLED ON NULL INPUTRETURNS NULL ON NULL INPUTSTRICTCALLED ON NULL INPUT(по ÑмолÑаниÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана как обÑÑно, еÑли ÑÑеди ÐµÑ Ð°ÑгÑменÑов оказÑваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL. Ð ÑÑом ÑлÑÑае оÑвеÑÑÑвенноÑÑÑ Ð·Ð° пÑовеÑÐºÑ Ð·Ð½Ð°Ñений NULL и ÑооÑвеÑÑÑвÑÑÑÑÑ Ð¸Ñ Ð¾Ð±ÑабоÑÐºÑ Ð»Ð¾Ð¶Ð¸ÑÑÑ Ð½Ð° ÑазÑабоÑÑика ÑÑнкÑии.Указание
RETURNS NULL ON NULL INPUTилиSTRICTпоказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ñегда возвÑаÑÐ°ÐµÑ NULL, полÑÑив NULL в одном из аÑгÑменÑов. Ð¢Ð°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð°ÑгÑменÑами NULL, вмеÑÑо ÑÑого авÑомаÑиÑеÑки бÑÐ´ÐµÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ ÑезÑлÑÑÐ°Ñ NULL.[EXTERNAL] SECURITY INVOKER[EXTERNAL] SECURITY DEFINERХаÑакÑеÑиÑÑика
SECURITY INVOKER(безопаÑноÑÑÑ Ð²ÑзÑваÑÑего) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, вÑзвавÑего еÑ. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ. ÐаÑианÑSECURITY DEFINER(безопаÑноÑÑÑ Ð¾Ð¿ÑеделивÑего) опÑеделÑеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, ÑоздавÑего еÑ.ÐлÑÑевое Ñлово
EXTERNAL(внеÑнÑÑ) допÑÑкаеÑÑÑ Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑандаÑÑÑ SQL, но ÑвлÑеÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм, Ñак как, в оÑлиÑие Ð¾Ñ SQL, ÑÑа Ñ Ð°ÑакÑеÑиÑÑика ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° вÑе ÑÑнкÑии, а не ÑолÑко внеÑние.ÑÑоимоÑÑÑ_вÑполнениÑÐоложиÑелÑное ÑиÑло, задаÑÑее пÑимеÑнÑÑ ÑÑоимоÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии, в единиÑÐ°Ñ cpu_operator_cost. ÐÑли ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, ÑÑо ÑиÑло задаÑÑ ÑÑоимоÑÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки. ÐÑли ÑÑоимоÑÑÑ Ð½Ðµ Ñказана, Ð´Ð»Ñ ÑÑнкÑий на C и внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑÑнкÑий она ÑÑиÑаеÑÑÑ Ñавной 1 единиÑе, а Ð´Ð»Ñ ÑÑнкÑий на вÑÐµÑ Ð´ÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ â 100 единиÑам. ÐÑи болÑÑÐ¸Ñ Ð·Ð½Ð°ÑениÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик бÑÐ´ÐµÑ ÑÑаÑаÑÑÑÑ Ð½Ðµ вÑзÑваÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ ÑаÑе, Ñем ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾.
ÑÑÑок_в_ÑезÑлÑÑаÑеÐоложиÑелÑное ÑиÑло, задаÑÑее пÑимеÑное ÑиÑло ÑÑÑок, коÑоÑое бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик на вÑÑ Ð¾Ð´Ðµ ÑÑой ÑÑнкÑии. ÐÑо Ñказание допÑÑÑимо, ÑолÑко еÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена как возвÑаÑаÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво. ÐÑедполагаемое по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°Ñение â 1000 ÑÑÑок.
паÑамеÑÑ_конÑигÑÑаÑиизнаÑениеÐÑедложение
SETопÑеделÑеÑ, ÑÑо пÑи вÑзове ÑÑнкÑии ÑказаннÑй паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии должен пÑинÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение, а заÑем воÑÑÑановиÑÑ ÑÐ²Ð¾Ñ Ð¿ÑедÑдÑÑее знаÑение пÑи завеÑÑении ÑÑнкÑии. ÐÑедложениеSET FROM CURRENTÑÐ¾Ñ ÑанÑÐµÑ Ð² каÑеÑÑве знаÑениÑ, коÑоÑое бÑÐ´ÐµÑ Ð¿Ñименено пÑи Ð²Ñ Ð¾Ð´Ðµ в ÑÑнкÑиÑ, знаÑение, дейÑÑвÑÑÑее в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑполнениÑCREATE FUNCTION.ÐÑли в опÑеделение ÑÑнкÑии добавлено
SET, Ñо дейÑÑвие командÑSET LOCAL, вÑполнÑемой внÑÑÑи ÑÑнкÑии Ð´Ð»Ñ Ñого же паÑамеÑÑа, огÑаниÑиваеÑÑÑ Ñелом ÑÑнкÑии: пÑедÑдÑÑее знаÑение паÑамеÑÑа Ñак же бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановлено пÑи завеÑÑении ÑÑнкÑии. Ðднако обÑÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°SET(безLOCAL) пеÑеопÑеделÑÐµÑ Ð¿ÑедложениеSET, как и пÑедÑдÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑSET LOCAL: дейÑÑвие Ñакой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÑÐ´ÐµÑ ÑÐ¾Ñ Ñанено и поÑле завеÑÑÐµÐ½Ð¸Ñ ÑÑнкÑии, еÑли ÑолÑко не пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ ÑÑанзакÑии.Ðа подÑобнÑми ÑведениÑми об Ð¸Ð¼ÐµÐ½Ð°Ñ Ð¸ знаÑениÑÑ Ð¿Ð°ÑамеÑÑов обÑаÑиÑеÑÑ Ðº SET и Ðлаве 18.
опÑеделениеСÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа, опÑеделÑÑÑÐ°Ñ ÑеализаÑÐ¸Ñ ÑÑнкÑии; ÐµÑ Ð·Ð½Ð°Ñение завиÑÐ¸Ñ Ð¾Ñ ÑзÑка. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð¼Ñ Ð²Ð½ÑÑÑенней ÑÑнкÑии, пÑÑÑ Ðº обÑекÑÐ½Ð¾Ð¼Ñ ÑайлÑ, команда SQL или код ÑÑнкÑии на пÑоÑедÑÑном ÑзÑке.
ЧаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ заклÑÑаÑÑ Ð¾Ð¿Ñеделение ÑÑнкÑии в доллаÑÑ (Ñм. ÐодÑаздел 4.1.2.4), а не в ÑÑадиÑионнÑе апоÑÑÑоÑÑ. ÐÑли не иÑполÑзоваÑÑ Ð´Ð¾Ð»Ð»Ð°ÑÑ, вÑе апоÑÑÑоÑÑ Ð¸ обÑаÑнÑе коÑÑе ÑеÑÑÑ Ð² опÑеделении ÑÑнкÑии пÑидÑÑÑÑ ÑкÑаниÑоваÑÑ, дÑблиÑÑÑ Ð¸Ñ .
обÑекÑнÑй_Ñайл,обÑекÑнÑй_ÑимволÐÑа ÑоÑма пÑедложениÑ
ASпÑименÑеÑÑÑ Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки загÑÑжаемÑÑ ÑÑнкÑий на ÑзÑке C, когда Ð¸Ð¼Ñ ÑÑнкÑии в коде C не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑнкÑии в SQL. СÑÑокаобÑекÑнÑй_ÑайлзадаÑÑ Ð¸Ð¼Ñ Ñайла, ÑодеÑжаÑего динамиÑеÑки загÑÑжаемÑй обÑекÑ, аобÑекÑнÑй_Ñимволâ Ñимвол Ñкомпонованной ÑÑнкÑий, Ñо еÑÑÑ Ð¸Ð¼Ñ ÑÑнкÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде на ÑзÑке C. ÐÑли обÑекÑнÑй Ñимвол опÑÑен, пÑедполагаеÑÑÑ, ÑÑо он ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ опÑеделÑемой SQL-ÑÑнкÑии. Ð C имена вÑÐµÑ ÑÑнкÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазлиÑнÑми, поÑÑÐ¾Ð¼Ñ Ð¿ÐµÑегÑÑжаемÑм ÑÑнкÑиÑм, ÑеализованнÑм на C, нÑжно даваÑÑ ÑазнÑе имена (напÑимеÑ, вклÑÑаÑÑ Ð² имена C обознаÑÐµÐ½Ð¸Ñ Ñипов аÑгÑменÑов).ÐÑли повÑоÑнÑе вÑзовÑ
CREATE FUNCTIONÑÑÑлаÑÑÑÑ Ð½Ð° один и ÑÐ¾Ñ Ð¶Ðµ обÑекÑнÑй Ñайл, он загÑÑжаеÑÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа ÑолÑко один Ñаз. ЧÑÐ¾Ð±Ñ Ð²ÑгÑÑзиÑÑ Ð¸ загÑÑзиÑÑ ÑÑÐ¾Ñ Ñайл Ñнова (напÑимеÑ, в пÑоÑеÑÑе ÑазÑабоÑки), наÑниÑе новÑй ÑеанÑ.аÑÑибÑÑÐÑÑоÑиÑеÑки ÑложивÑийÑÑ ÑпоÑоб пеÑедаваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÑнкÑии. Ð ÑÑой запиÑи могÑÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ ÑледÑÑÑие аÑÑибÑÑÑ:
isStrictРавнознаÑно ÑказаниÑ
STRICTилиRETURNS NULL ON NULL INPUT.isCachableСвойÑÑво
isCachableâ ÑÑÑаÑевÑий ÑквиваленÑIMMUTABLE; оно вÑÑ ÐµÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ Ñади обÑаÑной ÑовмеÑÑимоÑÑи.
Ðмена аÑÑибÑÑов ÑвлÑÑÑÑÑ ÑегиÑÑÑонезавиÑимÑми.
Ðа дополниÑелÑной инÑоÑмаÑией о ÑазÑабоÑке ÑÑнкÑий обÑаÑиÑеÑÑ Ðº РазделÑ 35.3.
ÐеÑегÑÑзка
PostgreSQL допÑÑÐºÐ°ÐµÑ Ð¿ÐµÑегÑÑÐ·ÐºÑ ÑÑнкÑий; Ñо еÑÑÑ, позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð½Ð¾ Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑазлиÑнÑÑ ÑÑнкÑий, еÑли Ñ Ð½Ð¸Ñ ÑазлиÑаÑÑÑÑ ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð°ÑгÑменÑов. ÐезавиÑимо Ð¾Ñ Ñого, иÑполÑзÑеÑе Ð²Ñ ÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸Ð»Ð¸ неÑ, она ÑÑебÑÐµÑ Ð¿ÑедоÑÑоÑожноÑÑи пÑи вÑзове ÑÑнкÑий в Ð±Ð°Ð·Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ , где одни полÑзоваÑели не довеÑÑÑÑ Ð´ÑÑгим; Ñм. Раздел 10.3.
Ðве ÑÑнкÑии ÑÑиÑаÑÑÑÑ ÑовпадаÑÑими, еÑли они имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе имена и ÑÐ¸Ð¿Ñ Ð²Ñ
однÑÑ
аÑгÑменÑов, паÑамеÑÑÑ OUT игноÑиÑÑÑÑÑÑ. Таким обÑазом, напÑимеÑ, ÑÑи обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²ÑзовÑÑ ÐºÐ¾Ð½ÑликÑ:
CREATE FUNCTION foo(int) ... CREATE FUNCTION foo(int, out text) ...
ФÑнкÑии, имеÑÑие ÑазнÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов, не бÑдÑÑ ÑÑиÑаÑÑÑÑ ÐºÐ¾Ð½ÑликÑÑÑÑими в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑозданиÑ, но пÑедоÑÑавленнÑе Ð´Ð»Ñ Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзваÑÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸ÑполÑзованиÑ. ÐапÑимеÑ, ÑаÑÑмоÑÑиÑе ÑледÑÑÑие опÑеделениÑ:
CREATE FUNCTION foo(int) ... CREATE FUNCTION foo(int, int default 42) ...
ÐÑзов foo(10) завеÑÑиÑÑÑ Ð¾Ñибкой из-за неоднознаÑноÑÑи в вÑбоÑе вÑзÑваемой ÑÑнкÑии.
ÐамеÑаниÑ
РобÑÑвлении аÑгÑменÑов ÑÑнкÑии и возвÑаÑаемого знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿ÑÑкаеÑÑÑ Ð¿Ð¾Ð»Ð½Ñй ÑинÑакÑÐ¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñипа SQL. Ðднако модиÑикаÑоÑÑ Ñипа в ÑкобкаÑ
(напÑимеÑ, поле ÑоÑноÑÑи Ð´Ð»Ñ Ñипа numeric) команда CREATE FUNCTION не ÑÑиÑÑваеÑ. Так ÑÑо, напÑимеÑ, CREATE FUNCTION foo (varchar(10)) ... ÑоздаÑÑ ÑакÑÑ Ð¶Ðµ ÑÑнкÑиÑ, ÑÑо и CREATE FUNCTION foo (varchar) ....
ÐÑи замене ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE OR REPLACE FUNCTION еÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн паÑамеÑÑов. Ð ÑаÑÑноÑÑи, нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð¼Ñ, Ñже назнаÑенное лÑÐ±Ð¾Ð¼Ñ Ð²Ñ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ (Ñ
оÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñанее безÑмÑннÑм паÑамеÑÑам). Также, еÑли Ñ ÑÑнкÑии более одного вÑÑ
одного паÑамеÑÑа, нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¸Ð¼ÐµÐ½Ð° вÑÑ
однÑÑ
паÑамеÑÑов, Ñак как ÑÑо пÑиведÑÑ Ðº Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн ÑÑолбÑов анонимного ÑоÑÑавного Ñипа, опиÑÑваÑÑего ÑезÑлÑÑÐ°Ñ ÑÑнкÑии. ÐÑи огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð³Ð°ÑанÑиÑоваÑÑ, ÑÑо ÑÑÑеÑÑвÑÑÑие вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии не пеÑеÑÑанÑÑ ÑабоÑаÑÑ Ð¿Ð¾Ñле ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ñ.
ÐÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена как STRICT Ñ Ð°ÑгÑменÑом VARIADIC, пÑи оÑенивании ÑÑÑогоÑÑи пÑовеÑÑеÑÑÑ, ÑÑо веÑÑ Ð¿ÐµÑеменнÑй маÑÑив в Ñелом не NULL. ÐÑли же в ÑÑом маÑÑиве ÑодеÑжаÑÑÑ ÑлеменÑÑ NULL, ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ.
ÐÑимеÑÑ
Ðиже пÑиведено неÑколÑко пÑоÑÑÑÑ Ð²Ð²Ð¾Ð´Ð½ÑÑ Ð¿ÑимеÑов. Ðа дополниÑелÑнÑми ÑведениÑми и пÑимеÑами обÑаÑиÑеÑÑ Ðº РазделÑ 35.3.
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;ФÑнкÑÐ¸Ñ ÑвелиÑÐµÐ½Ð¸Ñ Ñелого ÑиÑла на 1, иÑполÑзÑÑÑÐ°Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй аÑгÑменÑ, на ÑзÑке PL/pgSQL:
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;ФÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ñ Ð½ÐµÑколÑкими вÑÑ Ð¾Ð´Ð½Ñми паÑамеÑÑами:
CREATE FUNCTION dup(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);То же Ñамое можно ÑделаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑазвÑÑнÑÑо, Ñвно обÑÑвив ÑоÑÑавной Ñип:
CREATE TYPE dup_result AS (f1 int, f2 text);
CREATE FUNCTION dup(int) RETURNS dup_result
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42); ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб веÑнÑÑÑ Ð½ÐµÑколÑко ÑÑолбÑов â пÑимениÑÑ ÑÑнкÑÐ¸Ñ TABLE:
CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42); Ðднако пÑÐ¸Ð¼ÐµÑ Ñ TABLE оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿ÑедÑдÑÑиÑ
, Ñак как в нÑм ÑÑнкÑÐ¸Ñ Ð½Ð° Ñамом деле возвÑаÑÐ°ÐµÑ Ð½Ðµ однÑ, а Ð½Ð°Ð±Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñей.
РазÑабоÑка заÑиÑÑннÑÑ
ÑÑнкÑий SECURITY DEFINER
Так как ÑÑнкÑÐ¸Ñ SECURITY DEFINER вÑполнÑеÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, ÑоздавÑего еÑ, необÑ
одимо позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ ÐµÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло иÑполÑзоваÑÑ Ð½Ðµ по назнаÑениÑ. Ð ÑелÑÑ
безопаÑноÑÑи в пÑÑи search_path ÑледÑÐµÑ Ð¸ÑклÑÑиÑÑ Ð»ÑбÑе ÑÑ
емÑ, доÑÑÑпнÑе на запиÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑм полÑзоваÑелÑм. ÐÑо не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð·Ð»Ð¾Ð½Ð°Ð¼ÐµÑеннÑм полÑзоваÑелÑм ÑоздаÑÑ Ñвои обÑекÑÑ, коÑоÑÑе замаÑкиÑÑÑÑ Ð¾Ð±ÑекÑÑ, иÑполÑзÑемÑе ÑÑнкÑией. ÐÑобенно важно в ÑÑом оÑноÑении оÑклÑÑиÑÑ ÑÑ
ÐµÐ¼Ñ Ð²ÑеменнÑÑ
ÑаблиÑ, коÑоÑÐ°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑоÑмаÑÑиваеÑÑÑ Ð¿ÐµÑвой, а пÑаво запиÑи в Ð½ÐµÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð²Ñе. СооÑвеÑÑÑвÑÑÑÑÑ Ð·Ð°ÑиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑганизоваÑÑ, помеÑÑив вÑеменнÑÑ ÑÑ
ÐµÐ¼Ñ Ð² ÐºÐ¾Ð½ÐµÑ ÑпиÑка поиÑка. ÐÐ»Ñ ÑÑого ÑледÑÐµÑ ÑделаÑÑ pg_temp поÑледней запиÑÑÑ Ð² search_path. ТакÑÑ Ð·Ð°ÑиÑÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ ÑледÑÑÑÐ°Ñ ÑÑнкÑиÑ:
CREATE FUNCTION check_password(uname TEXT, pass TEXT)
RETURNS BOOLEAN AS $$
DECLARE passed BOOLEAN;
BEGIN
SELECT (pwd = $2) INTO passed
FROM pwds
WHERE username = $1;
RETURN passed;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
-- УÑÑановиÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑй пÑÑÑ Ð¿Ð¾Ð¸Ñка: ÑнаÑала довеÑÐµÐ½Ð½Ð°Ñ ÑÑ
ема(Ñ), заÑем 'pg_temp'.
SET search_path = admin, pg_temp;Ðо PostgreSQL 8.3 Ñказание SET оÑÑÑÑÑÑвовало, Ñак ÑÑо ÑÑаÑÑе ÑÑнкÑии могÑÑ ÑодеÑжаÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑложнÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ Ð´Ð»Ñ ÑоÑ
ÑанениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ воÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной search_path. СÑÑеÑÑвÑÑÑее ÑепеÑÑ Ñказание SET позволÑÐµÑ ÑделаÑÑ ÑÑо намного пÑоÑе.
Также ÑледÑÐµÑ Ð¿Ð¾Ð¼Ð½Ð¸ÑÑ Ð¾ Ñом, ÑÑо по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ñаво вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑоздаваемÑÑ
ÑÑнкÑий Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ð»Ñ PUBLIC (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº GRANT). Ðднако ÑаÑÑо ÑÑебÑеÑÑÑ ÑазÑеÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑнкÑиÑм, ÑабоÑаÑÑим в конÑекÑÑе опÑеделивÑего, ÑолÑко некоÑоÑÑм полÑзоваÑелÑм. ÐÐ»Ñ ÑÑого необÑ
одимо оÑозваÑÑ ÑÑандаÑÑнÑе пÑава PUBLIC и заÑем даÑÑ Ð¿Ñава на вÑполнение индивидÑалÑно. ЧÑÐ¾Ð±Ñ Ð½Ðµ обÑазовалоÑÑ Ð¾ÐºÐ½Ð¾, в коÑоÑом Ð½Ð¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна вÑем, ÑоздайÑе ÐµÑ Ð¸ назнаÑÑÑе пÑава в одной ÑÑанзакÑии. ÐапÑимеÑ, Ñак:
BEGIN; CREATE FUNCTION check_password(uname TEXT, pass TEXT) ... SECURITY DEFINER; REVOKE ALL ON FUNCTION check_password(uname TEXT, pass TEXT) FROM PUBLIC; GRANT EXECUTE ON FUNCTION check_password(uname TEXT, pass TEXT) TO admins; COMMIT;
СовмеÑÑимоÑÑÑ
Ðоманда CREATE FUNCTION опÑеделена в SQL:1999 и более поздниÑ
ÑÑандаÑÑаÑ
. ÐеÑÑиÑ, ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð² PostgreSQL, близка к ÑÑандаÑÑизиÑованной, но ÑооÑвеÑÑÑвÑÐµÑ ÐµÐ¹ не полноÑÑÑÑ. Ð ÑаÑÑноÑÑи, непеÑеноÑÐ¸Ð¼Ñ Ð°ÑÑибÑÑÑ, а Ñакже ÑазлиÑнÑе ÑзÑки ÑеализаÑий.
ÐÐ»Ñ ÑовмеÑÑимоÑÑи Ñ Ð´ÑÑгими СУÐÐ Ñежим_аÑгÑменÑа можно запиÑаÑÑ Ð¿Ð¾Ñле имÑ_аÑгÑменÑа или пеÑед ним, но ÑÑандаÑÑÑ ÑооÑвеÑÑÑвÑÐµÑ ÑолÑко пеÑвÑй ваÑианÑ.
ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов ÑÑандаÑÑ SQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко ÑинÑакÑÐ¸Ñ Ñ ÐºÐ»ÑÑевÑм Ñловом DEFAULT. СинÑакÑÐ¸Ñ Ñо знаком = иÑполÑзÑеÑÑÑ Ð² T-SQL и Firebird.