35.5. ÐеÑегÑÑзка ÑÑнкÑий
ÐÑ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ Ð½ÐµÑколÑко ÑÑнкÑий Ñ Ð¾Ð´Ð½Ð¸Ð¼ именем SQL, еÑли ÑÑи ÑÑнкÑии бÑдÑÑ Ð¿ÑинимаÑÑ ÑазнÑе аÑгÑменÑÑ. ÐÑÑгими Ñловами, имена ÑÑнкÑий можно пеÑегÑÑжаÑÑ. ÐезавиÑимо Ð¾Ñ Ñого, иÑполÑзÑеÑе Ð²Ñ ÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸Ð»Ð¸ неÑ, она ÑÑебÑÐµÑ Ð¿ÑедоÑÑоÑожноÑÑи пÑи вÑзове ÑÑнкÑий в Ð±Ð°Ð·Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ , где одни полÑзоваÑели не довеÑÑÑÑ Ð´ÑÑгим; Ñм. Раздел 10.3. Ðогда вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑоÑ, ÑеÑÐ²ÐµÑ Ð¾Ð¿ÑеделÑеÑ, какÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваÑÑ, по колиÑеÑÑÐ²Ñ Ð¸ Ñипам пÑедÑÑавленнÑÑ Ð°ÑгÑменÑов. ÐеÑегÑÑзка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¸Ð¼Ð¸ÑаÑии ÑÑнкÑий Ñ Ð¿ÐµÑеменнÑм колиÑеÑÑвом аÑгÑменÑов, до какого-Ñо конеÑного ÑиÑла.
Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°Ñ ÑемейÑÑво пеÑегÑÑженнÑÑ ÑÑнкÑий, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ не допÑÑкаÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑи. ÐапÑимеÑ, еÑли ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÑÑнкÑии:
CREATE FUNCTION test(int, real) RETURNS ... CREATE FUNCTION test(smallint, double precision) RETURNS ...
не вполне понÑÑно, ÐºÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана Ñ Ð´Ð¾Ð²Ð¾Ð»Ñно пÑоÑÑÑми аÑгÑменÑами вÑоде test(1, 1.5). РеализованнÑе в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ñавила ÑазÑеÑÐµÐ½Ð¸Ñ Ñипов опиÑÐ°Ð½Ñ Ð² Ðлаве 10, но ÑазÑабаÑÑваÑÑ ÑиÑÑемÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ·Ð°Ð¼ÐµÑно полагаÑÑÑÑ Ð½Ð° Ñакие оÑобенноÑÑи, неÑазÑмно.
ФÑнкÑии, пÑинимаÑÑей один аÑгÑÐ¼ÐµÐ½Ñ ÑоÑÑавного Ñипа, обÑÑно не ÑледÑÐµÑ Ð´Ð°Ð²Ð°ÑÑ Ð¸Ð¼Ñ, ÑовпадаÑÑее Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ какого-либо аÑÑибÑÑа (полÑ) ÑÑого Ñипа. ÐÑпомниÑе, ÑÑо запиÑÑ Ð°ÑÑибÑÑ(ÑаблиÑа) ÑÑиÑаеÑÑÑ ÑавнознаÑной ÑаблиÑа.аÑÑибÑÑ. Ð ÑлÑÑае, когда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑнкÑией, пÑинимаÑÑей ÑоÑÑавной Ñип, и аÑÑибÑÑом ÑоÑÑавного Ñипа, вÑегда бÑÐ´ÐµÑ Ð²ÑбиÑаÑÑÑÑ Ð°ÑÑибÑÑ. ÐÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑеопÑеделиÑÑ, дополнив Ð¸Ð¼Ñ ÑÑнкÑии ÑÑ
емой (Ñо еÑÑÑ, запиÑав ÑÑ
ема.ÑÑнкÑиÑ(ÑаблиÑа)), но лÑÑÑе избежаÑÑ ÑÑой пÑоблемÑ, подобÑав ÑазнÑе имена.
ÐÑÑгой Ñип конÑликÑа возможен Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑÑнÑми ÑÑнкÑиÑми и ÑÑнкÑиÑми Ñ Ð¿ÐµÑеменнÑми паÑамеÑÑами. ÐапÑимеÑ, можно ÑоздаÑÑ ÑÑнкÑии foo(numeric) и foo(VARIADIC numeric[]). Ð ÑÑом ÑлÑÑае бÑÐ´ÐµÑ Ð½ÐµÐ¿Ð¾Ð½ÑÑно, ÐºÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑбиÑаÑÑÑÑ Ð¿Ñи пеÑедаÑе одного ÑиÑлового аÑгÑменÑа, напÑÐ¸Ð¼ÐµÑ foo(10.1). ÐÑи ÑазÑеÑении ÑÑого конÑликÑа пÑедпоÑÑение оÑдаÑÑÑÑ ÑÑнкÑии, найденной пеÑвой по пÑÑи поиÑка, либо, еÑли две ÑÑнкÑии наÑ
одÑÑÑÑ Ð² одной ÑÑ
еме, вÑбиÑаеÑÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð¿Ð¾ÑÑоÑннÑми аÑгÑменÑами.
ÐÑи пеÑегÑÑзке ÑÑнкÑий на ÑзÑке C еÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное огÑаниÑение: Ð¸Ð¼Ñ ÑÑÐ¾Ð²Ð½Ñ C каждой ÑÑнкÑии в ÑемейÑÑве пеÑегÑÑженнÑÑ
ÑÑнкÑий должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн ÑÑÐ¾Ð²Ð½Ñ C вÑеÑ
дÑÑгиÑ
ÑÑнкÑий, как внÑÑÑенниÑ
, Ñак и загÑÑжаемÑÑ
динамиÑеÑки. ÐÑли ÑÑо пÑавило наÑÑÑаеÑÑÑ, поведение завиÑÐ¸Ñ Ð¾Ñ ÑÑедÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð¾ÑÐ¸Ð±ÐºÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²Ñика во вÑÐµÐ¼Ñ Ð²ÑполнениÑ, либо бÑÐ´ÐµÑ Ð²Ñзвана не Ñа ÑÑнкÑÐ¸Ñ (обÑÑно внÑÑÑеннÑÑ). ÐлÑÑеÑнаÑÐ¸Ð²Ð½Ð°Ñ ÑоÑма пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ AS Ð´Ð»Ñ SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE FUNCTION позволÑÐµÑ Ð¾ÑвÑзаÑÑ Ð¸Ð¼Ñ SQL-ÑÑнкÑии Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸, опÑеделÑнного в иÑÑ
одном коде на C. ÐапÑимеÑ:
CREATE FUNCTION test(int) RETURNS int
AS 'имÑ_Ñайла', 'test_1arg'
LANGUAGE C;
CREATE FUNCTION test(int, int) RETURNS int
AS 'имÑ_Ñайла', 'test_2arg'
LANGUAGE C;Ðмена ÑÑнкÑий на C здеÑÑ ÑледÑÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· множеÑÑва возможнÑÑ ÑоглаÑений.