37.2. СиÑÑема Ñипов Postgres Pro
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Postgres Pro делÑÑÑÑ Ð½Ð° базовÑе, ÑипÑ-конÑейнеÑÑ, ÑоÑÑавнÑе, доменнÑе и пÑевдоÑипÑ.
37.2.1. ÐазовÑе ÑипÑ
ÐазовÑе ÑÐ¸Ð¿Ñ â ÑÑо ÑипÑ, Ñакие как integer, коÑоÑÑе ÑеализÑÑÑÑÑ Ð½Ð¸Ð¶Ðµ ÑÑÐ¾Ð²Ð½Ñ ÑзÑка SQL (обÑÑно на низкоÑÑовневом ÑзÑке, напÑÐ¸Ð¼ÐµÑ C). РобÑиÑ
ÑеÑÑаÑ
они ÑооÑвеÑÑÑвÑÑÑ Ñак назÑваемÑм абÑÑÑакÑнÑм Ñипам даннÑÑ
. Postgres Pro Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñ Ñакими Ñипами ÑолÑко ÑеÑез ÑÑнкÑии, пÑедоÑÑавленнÑе полÑзоваÑелем, и понимаÑÑ Ð¸Ñ
поведение ÑолÑко в Ñой ÑÑепени, в какой его опиÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐÑÑÑоеннÑе базовÑе ÑÐ¸Ð¿Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð² Ðлаве 8.
ТипÑ-пеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ (enum) можно ÑÑиÑаÑÑ Ð¿Ð¾Ð´ÐºÐ°ÑегоÑией базовÑÑ Ñипов. Ðни оÑлиÑаÑÑÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ñипов Ñем, ÑÑо Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ Ð¿ÑоÑÑо командами SQL, Ð¾Ð±Ñ Ð¾Ð´ÑÑÑ Ð±ÐµÐ· низкоÑÑовневого пÑогÑаммиÑованиÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.7.
37.2.2. ТипÑ-конÑейнеÑÑ
Ð Postgres Pro еÑÑÑ ÑÑи вида «Ñипов-конÑейнеÑов», Ñо еÑÑÑ Ñипов, коÑоÑÑе могÑÑ ÑодеÑжаÑÑ Ð² Ñебе неÑколÑко знаÑений дÑÑÐ³Ð¸Ñ Ñипов. ÐÑо маÑÑивÑ, ÑоÑÑавнÑе ÑÐ¸Ð¿Ñ Ð¸ диапазонÑ.
ÐаÑÑÐ¸Ð²Ñ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво знаÑений, имеÑÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ Ñип. Тип маÑÑива авÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ базового и ÑоÑÑавного Ñипа, диапазона и домена, но не Ð´Ð»Ñ Ð¼Ð°ÑÑивов â маÑÑÐ¸Ð²Ñ Ð¼Ð°ÑÑивов не ÑÑÑеÑÑвÑÑÑ. ÐÐ»Ñ ÑиÑÑÐµÐ¼Ñ Ñипов многомеÑнÑе маÑÑÐ¸Ð²Ñ Ð½Ðµ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑÑ . Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.15.
СоÑÑавнÑе ÑипÑ, или ÑÐ¸Ð¿Ñ ÑÑÑок, обÑазÑÑÑÑÑ Ð¿Ñи Ñоздании лÑбой ÑаблиÑÑ. С помоÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE Ñакже можно опÑеделиÑÑ Â«Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑй» ÑоÑÑавной Ñип, не ÑвÑзаннÑй Ñ ÑаблиÑей. СоÑÑавной Ñип пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо ÑпиÑок Ñипов Ñ Ð¾Ð¿ÑеделÑннÑми именами полей. ÐнаÑением ÑоÑÑавного Ñипа ÑвлÑеÑÑÑ ÑÑÑока ÑаблиÑÑ Ð¸Ð»Ð¸ запиÑÑ Ð¸Ð· знаÑений полей. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.16.
ÐиапазоннÑй Ñип Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´Ð²Ð° знаÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа, коÑоÑÑе опÑеделÑÑÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð¸ веÑÑ Ð½ÑÑ Ð³ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°. ÐиапазоннÑе ÑÐ¸Ð¿Ñ ÑоздаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем, Ñ Ð¾ÑÑ ÑÑÑеÑÑвÑÐµÑ Ð¸ неÑколÑко вÑÑÑоеннÑÑ . Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.17.
37.2.3. ÐоменÑ
Ðомен оÑновÑваеÑÑÑ Ð½Ð° опÑеделÑнном нижележаÑем Ñипе и во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð°ÑпекÑÐ°Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð·Ð°Ð¼ÐµÐ½Ñем Ñ Ð½Ð¸Ð¼. Ðднако домен Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð³ÑаниÑениÑ, ÑменÑÑаÑÑие множеÑÑво допÑÑÑимÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ знаÑений оÑноÑиÑелÑно нижележаÑего Ñипа. ÐÐ¾Ð¼ÐµÐ½Ñ ÑоздаÑÑÑÑ SQL-командой CREATE DOMAIN. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.18.
37.2.4. ÐÑевдоÑипÑ
ÐÐ»Ñ ÑпеÑиалÑнÑÑ Ñелей ÑÑÑеÑÑвÑÐµÑ Ñакже неÑколÑко «пÑевдоÑипов». ÐÑевдоÑÐ¸Ð¿Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð² ÑÑолбÑÐ°Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ в ÑÐ¸Ð¿Ð°Ñ -конÑейнеÑÐ°Ñ , но Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð² обÑÑвлениÑÑ Ð°ÑгÑменÑов и ÑезÑлÑÑаÑов ÑÑнкÑий. ÐÑо даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑделиÑÑ Ð² ÑиÑÑеме Ñипов ÑпеÑиалÑнÑе клаÑÑÑ ÑÑнкÑий. ÐÑе ÑÑÑеÑÑвÑÑÑие пÑевдоÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.27.
37.2.5. ÐолимоÑÑнÑе ÑипÑ
ÐÑобÑй инÑеÑÐµÑ Ð¿ÑедÑÑавлÑÐµÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво пÑевдоÑипов, полимоÑÑнÑе ÑипÑ, коÑоÑÑе пÑименÑÑÑÑÑ Ð² обÑÑвлениÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑÑ ÑÑнкÑий. ÐÑполÑзÑÑ Ñакие ÑипÑ, можно обÑÑвиÑÑ Ð²Ñего Ð¾Ð´Ð½Ñ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ñ ÑазнÑми Ñипами даннÑÑ , опÑеделÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе ÑÐ¸Ð¿Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, знаÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¸Ñ Ñипов бÑли пеÑÐµÐ´Ð°Ð½Ñ ÐµÐ¹ пÑи вÑзове. ÐолимоÑÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 37.1. ÐекоÑоÑÑе пÑимеÑÑ Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² ÐодÑазделе 37.5.11.
ТаблиÑа 37.1. ÐолимоÑÑнÑе ÑипÑ
| ÐÐ¼Ñ | СемейÑÑво | ÐпиÑание |
|---|---|---|
anyelement | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип |
anyarray | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип маÑÑива |
anynonarray | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип, оÑлиÑнÑй Ð¾Ñ Ð¼Ð°ÑÑива |
anyenum | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип-пеÑеÑиÑление (Ñм. Раздел 8.7) |
anyrange | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой диапазоннÑй Ñип (Ñм. Раздел 8.17) |
anymultirange | ÐÑоÑÑое | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой мÑлÑÑидиапазоннÑй Ñип (Ñм. Раздел 8.17) |
anycompatible | ÐбÑее | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип, Ñ Ð°Ð²ÑомаÑиÑеÑким пÑиведением неÑколÑÐºÐ¸Ñ Ð°ÑгÑменÑов к обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ |
anycompatiblearray | ÐбÑее | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип маÑÑива, Ñ Ð°Ð²ÑомаÑиÑеÑким пÑиведением неÑколÑÐºÐ¸Ñ Ð°ÑгÑменÑов к обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ |
anycompatiblenonarray | ÐбÑее | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой Ñип, оÑлиÑнÑй Ð¾Ñ Ð¼Ð°ÑÑива, Ñ Ð°Ð²ÑомаÑиÑеÑким пÑиведением неÑколÑÐºÐ¸Ñ Ð°ÑгÑменÑов к обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ |
anycompatiblerange | ÐбÑее | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой диапазоннÑй Ñип, Ñ Ð°Ð²ÑомаÑиÑеÑким пÑиведением неÑколÑÐºÐ¸Ñ Ð°ÑгÑменÑов к обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ |
anycompatiblemultirange | ÐбÑее | УказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð»Ñбой мÑлÑÑидиапазоннÑй Ñип даннÑÑ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑиводиÑÑ ÑазлиÑнÑе аÑгÑменÑÑ Ðº обÑÐµÐ¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ |
ÐолимоÑÑнÑе аÑгÑменÑÑ Ð¸ ÑезÑлÑÑаÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð´ÑÑг Ñ Ð´ÑÑгом и ÑводÑÑÑÑ Ðº конкÑеÑнÑм Ñипам даннÑм пÑи ÑазбоÑе запÑоÑа, вÑзÑваÑÑего полимоÑÑнÑÑ ÑÑнкÑиÑ. Ðогда полимоÑÑнÑÑ Ð°ÑгÑменÑов неÑколÑко, ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовмеÑаÑÑÑÑ, как опиÑано далее. ÐÑли Ñип ÑезÑлÑÑаÑа ÑÑнкÑии полимоÑÑнÑй или Ñ Ð½ÐµÑ Ð¸Ð¼ÐµÑÑÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ñе паÑамеÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑÑ Ñипов, ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ ÑÑÐ¸Ñ ÑезÑлÑÑаÑов вÑводÑÑÑÑ Ð¸Ð· Ñипов полимоÑÑнÑÑ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений, как опиÑано ниже.
ÐÐ»Ñ Â«Ð¿ÑоÑÑого» ÑемейÑÑва полимоÑÑнÑÑ Ñипов дейÑÑвÑÑÑ ÑледÑÑÑие пÑавила ÑовмеÑÐµÐ½Ð¸Ñ Ð¸ вÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñипов:
Ркаждой позиÑии (в аÑгÑменÑаÑ
или возвÑаÑаемом знаÑении), обÑÑвленной как anyelement, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой ÑакÑиÑеÑкий Ñип даннÑÑ
, но в каждом конкÑеÑном вÑзове вÑе ÑÑи ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми. ÐналогиÑнÑм обÑазом, в каждой позиÑии, обÑÑвленной как anyarray, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой Ñип даннÑÑ
маÑÑива, но вÑе ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ. Так же и во вÑеÑ
позиÑиÑÑ
, обÑÑвленнÑÑ
как anyrange, должен пеÑедаваÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй диапазоннÑй Ñип, а в обÑÑвленнÑÑ
как anymultirange â одинаковÑй мÑлÑÑидиапазоннÑй Ñип.
Ðолее Ñого, еÑли некоÑоÑÑе позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyarray, а дÑÑгие как anyelement, Ñо ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyarray должен бÑÑÑ Ð¼Ð°ÑÑив, ÑлеменÑÑ ÐºÐ¾ÑоÑого имеÑÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо и знаÑÐµÐ½Ð¸Ñ Ð² позиÑиÑÑ
anyelement. ÐÑевдоÑип anynonarray обÑабаÑÑваеÑÑÑ Ñак же, как anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм огÑаниÑением â ÑакÑиÑеÑкий Ñип не должен бÑÑÑ Ñипом маÑÑива. ÐÑевдоÑип anyenum Ñоже обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº anyelement, но его ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð¾Ð³ÑаниÑиваÑÑÑÑ Ð¿ÐµÑеÑиÑлениÑми.
ÐодобнÑм обÑазом, еÑли одни позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyrange, а дÑÑгие как anyelement или anyarray, ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyrange должен бÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, подÑип коÑоÑого ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ñипом ÑлеменÑов в позиÑиÑÑ
anyelement и Ñ Ñипом, пеÑедаваемÑм в позиÑиÑÑ
anyarray. ÐÑли еÑÑÑ Ð¿Ð¾Ð·Ð¸Ñии, обÑÑвленнÑе anymultirange, иÑ
ÑакÑиÑеÑкий мÑлÑÑидиапазоннÑй Ñип должен ÑодеÑжаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ, ÑооÑвеÑÑÑвÑÑÑие обÑÑвленнÑм паÑамеÑÑам anyrange, и базовÑе ÑлеменÑÑ, ÑооÑвеÑÑÑвÑÑÑие паÑамеÑÑам, обÑÑвленнÑм anyelement и anyarray.
Таким обÑазом, когда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено неÑколÑко аÑгÑменÑов, в иÑоге допÑÑкаÑÑÑÑ ÑолÑко опÑеделÑннÑе комбинаÑии ÑакÑиÑеÑкиÑ
Ñипов. ÐапÑимеÑ, ÑÑнкÑиÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ°Ðº equal(anyelement, anyelement), пÑÐ¸Ð¼ÐµÑ Ð² аÑгÑменÑаÑ
лÑбÑе два знаÑениÑ, но ÑолÑко еÑли иÑ
ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑовпадаÑÑ.
Ðогда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено возвÑаÑаемое знаÑение ÑÑнкÑии, Ñак же полимоÑÑнÑм должен бÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один аÑгÑменÑ, и ÑакÑиÑеÑкий Ñип ÑезÑлÑÑаÑа пÑи конкÑеÑном вÑзове опÑеделиÑÑÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ ÑакÑиÑеÑки пеÑеданного полимоÑÑного аÑгÑменÑа (или аÑгÑменÑов). ÐапÑимеÑ, еÑли Ð±Ñ Ð¾ÑÑÑÑÑÑвовал меÑ
анизм обÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива, его можно бÑло Ð±Ñ ÑеализоваÑÑ, Ñоздав ÑÑнкÑÐ¸Ñ subscript(anyarray, integer) returns anyelement. С Ñаким обÑÑвлением пеÑвÑм ÑакÑиÑеÑким аÑгÑменÑом должен бÑÑÑ Ð¼Ð°ÑÑив, и из него бÑÐ´ÐµÑ Ð²Ñведен пÑавилÑнÑй Ñип ÑезÑлÑÑаÑа пÑи ÑазбоÑе запÑоÑа. РкаÑеÑÑве дÑÑгого пÑимеÑа можно пÑивеÑÑи ÑÑнкÑÐ¸Ñ f(anyarray) returns anyenum, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑолÑко маÑÑÐ¸Ð²Ñ Ð¿ÐµÑеÑиÑлений.
РболÑÑинÑÑве ÑлÑÑаев пÑи ÑазбоÑе ÑÑнкÑии ÑакÑиÑеÑкий Ñип даннÑÑ
Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑного ÑезÑлÑÑаÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñведен из аÑгÑменÑов, имеÑÑиÑ
дÑÑгой полимоÑÑнÑй Ñип из Ñого же ÑемейÑÑва; напÑимеÑ, подÑип anyarray Ð¼Ð¾Ð¶ÐµÑ Ð²ÑводиÑÑÑÑ Ð¸Ð· anyelement и наобоÑоÑ. ÐÑклÑÑение пÑедÑÑавлÑÐµÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑй ÑезÑлÑÑÐ°Ñ Ñипа anyrange â Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑÑебÑеÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñипа anyrange; вÑвеÑÑи его ÑакÑиÑеÑкий Ñип из Ñипа аÑгÑменÑов anyarray или anyelement нелÑзÑ. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо на одном подÑипе могÑÑ Ð±Ð°Ð·Ð¸ÑоваÑÑÑÑ Ð½ÐµÑколÑко диапазоннÑÑ
Ñипов.
ÐамеÑÑÑе, ÑÑо anynonarray и anyenum пÑедÑÑавлÑÑÑ Ð½Ðµ оÑделÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÐµÑеменнÑÑ
; ÑÑо Ñе же ÑипÑ, ÑÑо и anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми огÑаниÑениÑми. ÐапÑимеÑ, обÑÑвление ÑÑнкÑии f(anyelement, anyenum) ÑавнознаÑно обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ f(anyenum, anyenum): оба ÑакÑиÑеÑкиÑ
аÑгÑменÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами-пеÑеÑиÑлениÑми.
ÐÐ»Ñ Â«Ð¾Ð±Ñего» ÑемейÑÑва полимоÑÑнÑÑ
Ñипов ÑабоÑаÑÑ Ð¿ÑимеÑно Ñе же пÑавила ÑовмеÑÐµÐ½Ð¸Ñ Ð¸ вÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñипов, ÑÑо и Ð´Ð»Ñ Â«Ð¿ÑоÑÑого» ÑемейÑÑва, но еÑÑÑ Ð¾Ð´Ð½Ð¾ важно оÑлиÑие: ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ, еÑли они могÑÑ Ð±ÑÑÑ Ð½ÐµÑвно пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ðº некоÑоÑÐ¾Ð¼Ñ Ð¾Ð±ÑÐµÐ¼Ñ ÑипÑ. ÐÑÐ¾Ñ Ð¾Ð±Ñий Ñип вÑбиÑаеÑÑÑ Ð¿Ð¾ Ñем же пÑавилам, ÑÑо пÑименÑÑÑÑÑ Ð² UNION и подобнÑÑ
конÑÑÑÑкÑиÑÑ
(Ñм. Раздел 10.5). ÐÑи вÑбоÑе обÑего Ñипа ÑÑиÑÑваÑÑÑÑ ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов anycompatible и anycompatiblenonarray, ÑÐ¸Ð¿Ñ ÑлеменÑов в аÑгÑменÑаÑ
anycompatiblearray, подÑÐ¸Ð¿Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² в аÑгÑменÑаÑ
anycompatiblerange и подÑÐ¸Ð¿Ñ Ð¼ÑлÑÑидиапазонов в аÑгÑменÑаÑ
anycompatiblemultirange. ÐÑли пÑиÑÑÑÑÑвÑÐµÑ Ñип anycompatiblenonarray, обÑим Ñипом не должен бÑÑÑ Ñип маÑÑива. ÐоÑле Ñого как обÑий Ñип опÑеделÑн, аÑгÑменÑÑ anycompatible и anycompatiblenonarray авÑомаÑиÑеÑки пÑиводÑÑÑÑ Ðº ÑÑÐ¾Ð¼Ñ ÑипÑ, а аÑгÑменÑÑ anycompatiblearray пÑиводÑÑÑÑ Ðº ÑипÑ-маÑÑÐ¸Ð²Ñ Ñ ÑлеменÑами ÑÑого Ñипа.
Так как невозможно вÑбÑаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ñй Ñип, Ð·Ð½Ð°Ñ ÑолÑко его подÑип, пÑи иÑполÑзовании anycompatiblerange и/или anycompatiblemultirange необÑ
одимо, ÑÑÐ¾Ð±Ñ Ð²Ñе аÑгÑменÑÑ, обÑÑвленнÑе Ñ ÑÑим Ñипом, имели один диапазоннÑй и/или мÑлÑÑидиапазоннÑй Ñип, а его подÑип ÑооÑвеÑÑÑвовал вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑÐµÐ¼Ñ ÑипÑ, ÑÑо позволÑÐµÑ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð±ÐµÐ· пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñипов Ð´Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ
знаÑений. Ðак и в ÑлÑÑае Ñ Ñипами anyrange и anymultirange, ÑÐ¸Ð¿Ñ anycompatiblerange и anycompatiblemultirange можно иÑполÑзоваÑÑ Ð² каÑеÑÑве Ñипа ÑезÑлÑÑаÑа ÑÑнкÑии, ÑолÑко еÑли Ñ Ð½ÐµÑ Ð¸Ð¼ÐµÐµÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñого же Ñипа (anycompatiblerange или anycompatiblemultirange).
ÐамеÑÑÑе, ÑÑо Ñипа anycompatibleenum не ÑÑÑеÑÑвÑеÑ. Такой Ñип бÑл Ð±Ñ Ð½Ðµ оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм, Ñак как никакиÑ
неÑвнÑÑ
пÑиведений к Ñипам-пеÑеÑиÑлениÑм обÑÑно неÑ, Ñо еÑÑÑ Ð½Ðµ ÑÑÑеÑÑвÑÐµÑ ÑпоÑоба найÑи обÑий Ñип Ð´Ð»Ñ Ð´Ð²ÑÑ
ÑазлиÑнÑÑ
пеÑеÑиÑлений.
ÐолимоÑÑнÑе ÑемейÑÑва «пÑоÑÑое» и «обÑее» пÑедÑÑавлÑÑÑ Ð´Ð²Ð° незавиÑимÑÑ Ð½Ð°Ð±Ð¾Ñа пеÑеменнÑÑ Ñипов. РаÑÑмоÑÑиÑе, напÑимеÑ, обÑÑвление:
CREATE FUNCTION myfunc(a anyelement, b anyelement,
c anycompatible, d anycompatible)
RETURNS anycompatible AS ...Ðогда ÑÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ, пеÑвÑе два аÑгÑменÑа обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ Ñип. ÐоÑледние два аÑгÑменÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑиводимÑми к обÑÐµÐ¼Ñ ÑипÑ, пÑиÑÑм ÑÑÐ¾Ñ Ñип Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑовпадаÑÑ Ñ Ñипом пеÑвÑÑ Ð´Ð²ÑÑ Ð°ÑгÑменÑов. ÐÑÐ¾Ñ Ð¾Ð±Ñий Ñип ÑÑÐ°Ð½ÐµÑ Ñипом ÑезÑлÑÑаÑа.
ФÑнкÑии Ñ Ð¿ÐµÑеменнÑм ÑиÑлом аÑгÑменÑом (опиÑаннÑе в ÐодÑазделе 37.5.6) Ñоже могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑми: Ð´Ð»Ñ ÑÑого иÑ
поÑледний паÑамеÑÑ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÐºÐ°Ðº VARIADIC anyarray или VARIADIC anycompatiblearray. ÐÐ»Ñ Ñелей ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов и опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑакÑиÑеÑкого Ñипа ÑезÑлÑÑаÑа ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ñак же, как еÑли Ð±Ñ Ð² ней Ñвно обÑÑвлÑлоÑÑ Ð½Ñжное ÑиÑло паÑамеÑÑов anynonarray или anycompatiblenonarray.