10.3. ФÑнкÑии
ÐÑи вÑбоÑе конкÑеÑной ÑÑнкÑии, задейÑÑвованной в вÑÑажении, PostgreSQL ÑледÑÐµÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ðµ алгоÑиÑмÑ.
РазÑеÑение ÑÑнкÑии по ÑипÑ
ÐÑбÑаÑÑ ÑÑнкÑии Ð´Ð»Ñ ÑаÑÑмоÑÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑиÑÑемного каÑалога
pg_proc. ÐÑли Ð¸Ð¼Ñ ÑÑнкÑии не дополнено именем ÑÑ ÐµÐ¼Ñ, бÑдÑÑ ÑаÑÑмаÑÑиваÑÑÑÑ Ð²Ñе ÑÑнкÑии Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑим именем и ÑиÑлом аÑгÑменÑов, видимÑе в ÑекÑÑем пÑÑи поиÑка (Ñм. ÐодÑаздел 5.9.3). ÐÑли Ð¸Ð¼Ñ ÑÑнкÑии опÑеделено полноÑÑÑÑ, в ÑаÑÑмоÑÑение пÑинимаÑÑÑÑ ÑолÑко ÑÑнкÑии из Ñказанной ÑÑ ÐµÐ¼Ñ.ÐÑли в пÑÑи поиÑка оказÑваеÑÑÑ Ð½ÐµÑколÑко ÑÑнкÑий Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами аÑгÑменÑов, ÑÑиÑÑваÑÑÑÑ ÑолÑко Ñе из Ð½Ð¸Ñ , коÑоÑÑе Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑÑи ÑанÑÑе. ФÑнкÑии Ñ ÑазнÑми Ñипами аÑгÑменÑов ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ð° ÑавнÑÑ Ð¿ÑÐ°Ð²Ð°Ñ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ð¸Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² пÑÑи поиÑка.
ÐÑли в ÑиÑле паÑамеÑÑов ÑÑнкÑии еÑÑÑ Ð¼Ð°ÑÑив
VARIADICи пÑи вÑзове не ÑказÑваеÑÑÑ ÐºÐ»ÑÑевое ÑловоVARIADIC, ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ, как еÑли Ð±Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð±Ñл заменÑн одним или неÑколÑкими паÑамеÑÑами Ñипа ÑлеменÑов маÑÑива, по ÑиÑÐ»Ñ Ð°ÑгÑменÑов пÑи вÑзове. ÐоÑле Ñакого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑакÑиÑеÑким Ñипам аÑгÑменÑов она Ð¼Ð¾Ð¶ÐµÑ ÑовпаÑÑÑ Ñ Ð½ÐµÐºÐ¾ÑоÑой ÑÑнкÑией Ñ Ð¿Ð¾ÑÑоÑннÑм ÑиÑлом аÑгÑменÑов. Ð ÑÑом ÑлÑÑае иÑполÑзÑеÑÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² пÑÑи ÑанÑÑе, а еÑли они оказÑваÑÑÑÑ Ð² одной ÑÑ ÐµÐ¼Ðµ, пÑедпоÑиÑаеÑÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ñ Ð¿Ð¾ÑÑоÑннÑми аÑгÑменÑами.ÐÑо ÑоздаÑÑ ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи пÑи вÑзове Ñ Ð¿Ð¾Ð»Ð½Ñм именем [10] ÑÑнкÑии Ñ Ð¿ÐµÑеменнÑм ÑиÑлом аÑгÑменÑов, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² ÑÑ ÐµÐ¼Ðµ, где могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели. ÐлонамеÑеннÑй полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑÑваÑÑ ÑпÑавление и вÑполнÑÑÑ Ð¿ÑоизволÑнÑе SQL-ÑÑнкÑии, как бÑдÑо Ð¸Ñ Ð²ÑполнÑеÑе вÑ. ÐапиÑÑ Ð²Ñзова Ñ ÐºÐ»ÑÑевÑм Ñловом
VARIADICÑÑÑÑанÑÐµÑ ÑÑÑ ÑгÑозÑ. Ðднако Ð´Ð»Ñ Ð²Ñзовов Ñ Ð¿ÐµÑедаÑей паÑамеÑÑовVARIADIC "any"ÑаÑÑо не ÑÑÑеÑÑвÑÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð¹ ÑоÑмÑлиÑовки Ñ ÐºÐ»ÑÑомVARIADIC. ЧÑÐ¾Ð±Ñ Ñакие вÑÐ·Ð¾Ð²Ñ Ð±Ñли безопаÑнÑми, Ñоздание обÑекÑов в ÑÑ ÐµÐ¼Ðµ ÑÑнкÑии должно ÑазÑеÑаÑÑÑÑ ÑолÑко довеÑеннÑм полÑзоваÑелÑм.ФÑнкÑии, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов по ÑмолÑаниÑ, ÑÑиÑаÑÑÑÑ ÑовпадаÑÑими Ñ Ð²Ñзовом, в коÑоÑом опÑÑено Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более паÑамеÑÑов в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¿Ð¾Ð·Ð¸ÑиÑÑ . ÐÑли Ð´Ð»Ñ Ð²Ñзова Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð½ÐµÑколÑко ÑÑнкÑий, иÑполÑзÑеÑÑÑ Ñа, ÑÑо обнаÑÑживаеÑÑÑ Ð² пÑÑи поиÑка ÑанÑÑе. ÐÑли в одной ÑÑ ÐµÐ¼Ðµ оказÑваÑÑÑÑ Ð½ÐµÑколÑко ÑÑнкÑий Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами в позиÑиÑÑ Ð¾Ð±ÑзаÑелÑнÑÑ Ð¿Ð°ÑамеÑÑов (ÑÑо возможно, еÑли в Ð½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑазнÑе набоÑÑ Ð¿ÑопÑÑкаемÑÑ Ð¿Ð°ÑамеÑÑов), ÑиÑÑема не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ Ð¾Ð¿ÑималÑнÑÑ, и вÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Â«Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑнÑй вÑзов ÑÑнкÑии», еÑли лÑÑÑее ÑооÑвеÑÑÑвие Ð´Ð»Ñ Ð²Ñзова не бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾.
ÐÑо ÑоздаÑÑ ÑгÑÐ¾Ð·Ñ Ð¿Ñи вÑзове Ñ Ð¿Ð¾Ð»Ð½Ñм именем [10] лÑбой ÑÑнкÑии, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² ÑÑ ÐµÐ¼Ðµ, где могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели. ÐлонамеÑеннÑй полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñже ÑÑÑеÑÑвÑÑÑей, пÑодÑблиÑовав паÑамеÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ и добавив дополниÑелÑнÑе Ñо знаÑениÑми по ÑмолÑаниÑ. Ð ÑезÑлÑÑаÑе пÑи поÑледÑÑÑÐ¸Ñ Ð²ÑÐ·Ð¾Ð²Ð°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð½Ðµ иÑÑ Ð¾Ð´Ð½Ð°Ñ ÑÑнкÑиÑ. ÐÐ»Ñ Ð»Ð¸ÐºÐ²Ð¸Ð´Ð°Ñии ÑÑой ÑгÑÐ¾Ð·Ñ Ð¿Ð¾Ð¼ÐµÑайÑе ÑÑнкÑии в ÑÑ ÐµÐ¼Ñ, в коÑоÑÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко довеÑеннÑе обÑекÑÑ.
ÐÑовеÑиÑÑ, Ð½ÐµÑ Ð»Ð¸ ÑÑнкÑии, пÑинимаÑÑей в ÑоÑноÑÑи ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð°ÑгÑменÑов. ÐÑли ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ ÐµÑÑÑ (она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко одной в оÑобÑанном Ñанее набоÑе), иÑполÑзоваÑÑ ÐµÑ. ÐÑÑÑÑÑÑвие ÑоÑного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÑоздаÑÑ ÑгÑÐ¾Ð·Ñ Ð²Ñзова Ñ Ð¿Ð¾Ð»Ð½Ñм именем [10] ÑÑнкÑии в ÑÑ ÐµÐ¼Ðµ, где могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели. Ð ÑÐ°ÐºÐ¸Ñ ÑиÑÑаÑиÑÑ Ð¿ÑиведиÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑоÑного ÑооÑвеÑÑÑвиÑ. (Ð ÑлÑÑаÑÑ Ñ
unknownÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑом ÑÑапе не бÑÐ´ÐµÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð°.)ÐÑли ÑоÑное Ñовпадение не найдено, пÑовеÑиÑÑ, не Ð¿Ð¾Ñ Ð¾Ð¶ ли вÑзов ÑÑнкÑии на оÑобÑÑ ÑоÑÐ¼Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов. ÐÑо Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда пÑи вÑзове ÑÑнкÑии пеÑедаÑÑÑÑ Ð²Ñего один аÑгÑÐ¼ÐµÐ½Ñ Ð¸ Ð¸Ð¼Ñ ÑÑнкÑии ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ (внÑÑÑенним) некоÑоÑого Ñипа даннÑÑ . Ðолее Ñого, аÑгÑменÑом ÑÑнкÑии должна бÑÑÑ Ð»Ð¸Ð±Ð¾ ÑÑÑока неопÑеделÑнного Ñипа, либо знаÑение Ñипа, двоиÑно-ÑовмеÑÑимого Ñ ÑказаннÑм или пÑиводимого к Ð½ÐµÐ¼Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑий ввода-вÑвода Ñипа (Ñо еÑÑÑ, пÑеобÑазований в ÑÑандаÑÑнÑй ÑÑÑоковÑй Ñип и обÑаÑно). ÐÑли ÑÑи ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð²ÑполнÑÑÑÑÑ, вÑзов ÑÑнкÑии воÑпÑинимаеÑÑÑ ÐºÐ°Ðº оÑÐ¾Ð±Ð°Ñ ÑоÑма конÑÑÑÑкÑии
CAST. [11]ÐайÑи ÑамÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий.
ÐÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð²Ñ Ð¾Ð´Ð½Ñе ÑÐ¸Ð¿Ñ Ð½Ðµ ÑовпадаÑÑ Ð¸ не могÑÑ Ð±ÑÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ (неÑвнÑм обÑазом) Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ Ñовпали. Рданном ÑлÑÑае ÑÑиÑаеÑÑÑ, ÑÑо конÑÑанÑÑ Ñипа
unknownможно пÑеобÑазоваÑÑ Ð²Ð¾ ÑÑо Ñгодно. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.ÐÑли один из аÑгÑменÑов Ð¸Ð¼ÐµÐµÑ Ñип домен, далее ÑÑиÑаÑÑ ÐµÐ³Ð¾ Ñипом базовÑй Ñип домена. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¿Ñи поиÑке неоднознаÑно заданной ÑÑнкÑии Ð´Ð¾Ð¼ÐµÐ½Ñ Ð±ÑдÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ Ñвои базовÑм Ñипам.
ÐÑоÑмоÑÑеÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов и оÑÑавиÑÑ ÑолÑко ÑÐµÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑоÑно ÑовпадаÑÑ ÐºÐ°Ðº можно болÑÑе Ñипов аÑгÑменÑов. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ÑоÑнÑÑ Ñовпадений неÑ. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.
ÐÑоÑмоÑÑеÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов и оÑÑавиÑÑ ÑолÑко ÑÐµÑ , коÑоÑÑе пÑинимаÑÑ Ð¿ÑедпоÑиÑаемÑе ÑÐ¸Ð¿Ñ (из каÑегоÑии Ñипов Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений) в наиболÑÑем ÑиÑле позиÑий, где ÑÑебÑеÑÑÑ Ð¿ÑеобÑазование Ñипов. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ни один не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÑедпоÑиÑаемÑе ÑипÑ. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.
ÐÑли какие-либо знаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ñип
unknown, пÑовеÑиÑÑ ÐºÐ°ÑегоÑии Ñипов, пÑинимаемÑÑ Ð² даннÑÑ Ð¿Ð¾Ð·Ð¸ÑиÑÑ Ð°ÑгÑменÑов оÑÑавÑимиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñами. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ позиÑии вÑбÑаÑÑ ÐºÐ°ÑегоÑиÑstring, еÑли какой-либо ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑÑ ÐºÐ°ÑегоÑиÑ. (ÐÑа ÑклонноÑÑÑ Ðº ÑÑÑокам обÑÑÑнÑеÑÑÑ Ñем, ÑÑо конÑÑанÑа Ñипа unknown вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº ÑÑÑока.) ÐÑли ÑÑа каÑегоÑÐ¸Ñ Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ, но вÑе оÑÑавÑиеÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°ÑÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ñ ÐºÐ°ÑегоÑиÑ, вÑбÑаÑÑ ÐµÑ; в пÑоÑивном ÑлÑÑае конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ â ÑделаÑÑ Ð¿ÑавилÑнÑй вÑÐ±Ð¾Ñ Ð±ÐµÐ· дополниÑелÑнÑÑ Ð¿Ð¾Ð´Ñказок нелÑзÑ. ÐаÑем оÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, коÑоÑÑе не пÑинимаÑÑ ÑÐ¸Ð¿Ñ Ð²ÑбÑанной каÑегоÑии. Ðалее, еÑли какой-либо ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÑедпоÑиÑаемÑй Ñип из ÑÑой каÑегоÑии, оÑбÑоÑиÑÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, пÑинимаÑÑÐ¸Ñ Ð´ÑÑгие, не пÑедпоÑиÑаемÑе ÑÐ¸Ð¿Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ аÑгÑменÑа. ÐÑÑавиÑÑ Ð²ÑÐµÑ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñов, еÑли ÑÑи пÑовеÑки не пÑоÑÑл ни один. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае пеÑейÑи к ÑледÑÑÑÐµÐ¼Ñ ÑагÑ.ÐÑли в ÑпиÑке аÑгÑменÑов еÑÑÑ Ð°ÑгÑменÑÑ Ð¸ Ñипа
unknown, и извеÑÑного Ñипа, и ÑÑÐ¾Ñ Ð¸Ð·Ð²ÐµÑÑнÑй Ñип один Ð´Ð»Ñ Ð²ÑÐµÑ Ð°ÑгÑменÑов, пÑедположиÑÑ, ÑÑо аÑгÑменÑÑ ÑипаunknownÑакже имеÑÑ ÑÑÐ¾Ñ Ñип, и пÑовеÑиÑÑ, какие кандидаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑинимаÑÑ ÑÑÐ¾Ñ Ñип в позиÑии аÑгÑменÑаunknown. ÐÑли оÑÑаÑÑÑÑ ÑолÑко один кандидаÑ, иÑполÑзоваÑÑ ÐµÐ³Ð¾, в пÑоÑивном ÑлÑÑае конÑÑаÑиÑоваÑÑ Ð½ÐµÑдаÑÑ.
ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ ÑÑнкÑий дейÑÑвÑÑÑ Ñе же пÑавила «опÑималÑного ÑооÑвеÑÑÑвиÑ», ÑÑо и Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов. Ðни пÑоиллÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ ÑледÑÑÑими пÑимеÑами.
ÐÑÐ¸Ð¼ÐµÑ 10.6. РазÑеÑение ÑÑнкÑии окÑÑÐ³Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñипам аÑгÑменÑов
Ð PostgreSQL еÑÑÑ ÑолÑко одна ÑÑнкÑÐ¸Ñ round, пÑинимаÑÑÐ°Ñ Ð´Ð²Ð° аÑгÑменÑа: пеÑвÑй Ñипа numeric, а вÑоÑой â integer. ÐоÑÑÐ¾Ð¼Ñ Ð² ÑледÑÑÑем запÑоÑе пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ integer авÑомаÑиÑеÑки пÑиводиÑÑÑ Ðº ÑÐ¸Ð¿Ñ numeric:
SELECT round(4, 4); round -------- 4.0000 (1 row)
Таким обÑазом, анализаÑÐ¾Ñ Ð¿ÑеобÑазÑÐµÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²:
SELECT round(CAST (4 AS numeric), 4);
Так как ÑиÑловÑе конÑÑанÑÑ Ñ Ð´ÐµÑÑÑиÑнÑми ÑоÑками изнаÑалÑно оÑноÑÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ numeric, Ð´Ð»Ñ ÑледÑÑÑего запÑоÑа пÑеобÑазование Ñипов не поÑÑебÑеÑÑÑ, Ñак ÑÑо он немного ÑÑÑекÑивнее:
SELECT round(4.0, 4);
ÐÑÐ¸Ð¼ÐµÑ 10.7. РазÑеÑение ÑÑнкÑий Ñ Ð¿ÐµÑеменнÑми паÑамеÑÑами
CREATE FUNCTION public.variadic_example(VARIADIC numeric[]) RETURNS int LANGUAGE sql AS 'SELECT 1'; CREATE FUNCTION
ÐÑа ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² аÑгÑменÑÐ°Ñ ÐºÐ»ÑÑевое Ñлово VARIADIC, но Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¸ без него. Ðй можно пеÑедаваÑÑ Ð¸ ÑелоÑиÑленнÑе, и лÑбÑе ÑиÑловÑе аÑгÑменÑÑ:
SELECT public.variadic_example(0),
public.variadic_example(0.0),
public.variadic_example(VARIADIC array[0.0]);
variadic_example | variadic_example | variadic_example
------------------+------------------+------------------
1 | 1 | 1
(1 row)
Ðднако Ð´Ð»Ñ Ð¿ÐµÑвого и вÑоÑого вÑзова пÑедпоÑÑиÑелÑнее окажÑÑÑÑ ÑпеÑиализиÑованнÑе ÑÑнкÑии, еÑли ÑаковÑе еÑÑÑ:
CREATE FUNCTION public.variadic_example(numeric) RETURNS int
LANGUAGE sql AS 'SELECT 2';
CREATE FUNCTION
CREATE FUNCTION public.variadic_example(int) RETURNS int
LANGUAGE sql AS 'SELECT 3';
CREATE FUNCTION
SELECT public.variadic_example(0),
public.variadic_example(0.0),
public.variadic_example(VARIADIC array[0.0]);
variadic_example | variadic_example | variadic_example
------------------+------------------+------------------
3 | 2 | 1
(1 row)
ÐÑли иÑполÑзÑеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ ÑÑÑеÑÑвÑÐµÑ ÑолÑко пеÑÐ²Ð°Ñ ÑÑнкÑиÑ, пеÑвÑй и вÑоÑой вÑÐ·Ð¾Ð²Ñ Ð±ÑдÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑми. ÐÑбой полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеÑ
ваÑиÑÑ Ð¸Ñ
, Ñоздав вÑоÑÑÑ Ð¸Ð»Ð¸ ÑÑеÑÑÑ ÑÑнкÑиÑ. ÐезопаÑнÑм бÑÐ´ÐµÑ ÑÑеÑий вÑзов, в коÑоÑом Ñип аÑгÑменÑа ÑооÑвеÑÑÑвÑÐµÑ Ð² ÑоÑноÑÑи и иÑполÑзÑеÑÑÑ ÐºÐ»ÑÑевое Ñлово VARIADIC.
ÐÑÐ¸Ð¼ÐµÑ 10.8. РазÑеÑение ÑÑнкÑии извлеÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ÑÑÑоки
Ð PostgreSQL еÑÑÑ Ð½ÐµÑколÑко ваÑианÑов ÑÑнкÑии substr, и один из ниÑ
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑменÑÑ Ñипов text и integer. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ñо ÑÑÑоковой конÑÑанÑой неопÑеделÑнного Ñипа, ÑиÑÑема вÑбиÑÐ°ÐµÑ ÑÑнкÑиÑ, пÑинимаÑÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑедпоÑиÑаемой каÑегоÑии string (а конкÑеÑнее, Ñипа text).
SELECT substr('1234', 3);
substr
--------
34
(1 row)
ÐÑли ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока Ð¸Ð¼ÐµÐµÑ Ñип varchar, напÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð³Ð´Ð° даннÑе поÑÑÑпаÑÑ Ð¸Ð· ÑаблиÑÑ, анализаÑÐ¾Ñ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿ÑивеÑÑи ÐµÑ Ðº ÑÐ¸Ð¿Ñ text:
SELECT substr (varchar '1234', 3);
substr
--------
34
(1 row)
ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ ÑакÑиÑеÑки пÑеобÑазÑÐµÑ Ð²:
SELECT substr(CAST (varchar '1234' AS text), 3);
ÐÑимеÑание
ÐнализаÑÐ¾Ñ ÑзнаÑÑ Ð¸Ð· каÑалога pg_cast, ÑÑо ÑÐ¸Ð¿Ñ text и varchar двоиÑно-ÑовмеÑÑимÑ, ÑÑо ознаÑаеÑ, ÑÑо один Ñип можно пеÑедаÑÑ ÑÑнкÑии, пÑинимаÑÑей дÑÑгой, не вÑполнÑÑ ÑизиÑеÑкого пÑеобÑазованиÑ. Таким обÑазом, в данном ÑлÑÑае опеÑаÑÐ¸Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ñамом не добавлÑеÑÑÑ.
РеÑли ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ñ Ð°ÑгÑменÑом Ñипа integer, анализаÑÐ¾Ñ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿ÑеобÑазоваÑÑ ÐµÐ³Ð¾ в Ñип text:
SELECT substr(1234, 3); ÐШÐÐÐÐ: ÑÑнкÑÐ¸Ñ substr(integer, integer) не ÑÑÑеÑÑвÑÐµÑ ÐÐÐСÐÐÐÐÐ: ФÑнкÑÐ¸Ñ Ñ Ð´Ð°Ð½Ð½Ñми именем и Ñипами аÑгÑменÑов не найдена. Ðозможно, вам ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑвнÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов.
ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð½Ðµ ÑабоÑаеÑ, Ñак как integer нелÑÐ·Ñ Ð½ÐµÑвно пÑеобÑазоваÑÑ Ð² text. Ðднако Ñ ÑвнÑм пÑеобÑазованием запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ:
SELECT substr(CAST (1234 AS text), 3);
substr
--------
34
(1 row)
[10] ÐÑа ÑгÑоза неакÑÑалÑна Ð´Ð»Ñ Ð¸Ð¼Ñн без ÑÑ ÐµÐ¼Ñ, Ñак как пÑÑÑ Ð¿Ð¾Ð¸Ñка, ÑодеÑжаÑий ÑÑ ÐµÐ¼Ñ, в коÑоÑÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑе полÑзоваÑели могÑÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ, не ÑооÑвеÑÑÑвÑÐµÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑ ÐµÐ¼.
[11] ÐÑÐ¾Ñ Ñаг нÑжен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑиведений Ñипов в ÑÑиле вÑзова ÑÑнкÑии, когда на Ñамом деле ÑооÑвеÑÑÑвÑÑÑей ÑÑнкÑии пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½ÐµÑ. ÐÑли ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐµÑÑÑ, она обÑÑно назÑваеÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ вÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа и Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи в оÑобом Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ неÑ. Ðа дополниÑелÑнÑми комменÑаÑиÑми обÑаÑиÑеÑÑ Ðº CREATE CAST.