CREATE CAST
CREATE CAST â ÑоздаÑÑ Ð¿Ñиведение
СинÑакÑиÑ
CREATE CAST (иÑÑ Ð¾Ð´Ð½Ñй_ÑипASÑелевой_Ñип) WITH FUNCTIONимÑ_ÑÑнкÑии(Ñип_аÑгÑменÑа[, ...]) [ AS ASSIGNMENT | AS IMPLICIT ] CREATE CAST (иÑÑ Ð¾Ð´Ð½Ñй_ÑипASÑелевой_Ñип) WITHOUT FUNCTION [ AS ASSIGNMENT | AS IMPLICIT ] CREATE CAST (иÑÑ Ð¾Ð´Ð½Ñй_ÑипASÑелевой_Ñип) WITH INOUT [ AS ASSIGNMENT | AS IMPLICIT ]
ÐпиÑание
CREATE CAST ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ пÑиведение. ÐÑиведение опÑеделÑеÑ, как вÑполниÑÑ Ð¿ÑеобÑазование из одного Ñипа в дÑÑгой. ÐапÑимеÑ,
SELECT CAST(42 AS float8);
пÑеобÑазÑÐµÑ ÑелоÑиÑленнÑÑ ÐºÐ¾Ð½ÑÑанÑÑ 42 к ÑÐ¸Ð¿Ñ float8, вÑзÑÐ²Ð°Ñ Ñанее опÑеделÑннÑÑ ÑÑнкÑиÑ, в данном ÑлÑÑае float8(int4). (ÐÑли подÑ
одÑÑее пÑиведение не опÑеделено, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка пÑеобÑазованиÑ.)
Ðва Ñипа могÑÑ Ð±ÑÑÑ Ð´Ð²Ð¾Ð¸Ñно-ÑводимÑми; ÑÑо ознаÑаеÑ, ÑÑо пÑеобÑазование Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñполнено «беÑплаÑно», без вÑзова какой-либо ÑÑнкÑии. ÐÐ»Ñ ÑÑого ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑооÑвеÑÑÑвÑÑÑие знаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ»Ð¸ одинаковое внÑÑÑеннее пÑедÑÑавление. ÐапÑимеÑ, ÑÐ¸Ð¿Ñ text и varchar двоиÑно-ÑводимÑе в обе ÑÑоÑонÑ. ÐÑноÑение двоиÑной ÑводимоÑÑи не обÑзаÑелÑно ÑиммеÑÑиÑно. ÐапÑимеÑ, пÑиведение Ñипа xml к ÑÐ¸Ð¿Ñ text в ÑекÑÑей ÑеализаÑии можно вÑполниÑÑ Ð±ÐµÑплаÑно, но Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² обÑаÑном напÑавлении ÑÑебÑеÑÑÑ ÑÑнкÑиÑ, вÑполнÑÑÑÐ°Ñ ÐºÐ°Ðº минимÑм ÑинÑакÑиÑеÑкÑÑ Ð¿ÑовеÑкÑ. (Ðва Ñипа, двоиÑно-ÑводимÑе в обе ÑÑоÑонÑ, Ñакже назÑваÑÑÑÑ Ð´Ð²Ð¾Ð¸Ñно-ÑовмеÑÑимÑми.)
ÐÑиведение можно опÑеделиÑÑ ÐºÐ°Ðº пÑеобÑазование ввода/вÑвода, иÑполÑзÑÑ Ñказание WITH INOUT. Ð ÑÑом ÑлÑÑае Ð´Ð»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа к дÑÑÐ³Ð¾Ð¼Ñ Ð²ÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ Ð²Ñвода иÑÑ
одного Ñипа даннÑÑ
, а вÑÐ´Ð°Ð½Ð½Ð°Ñ ÐµÐ¹ ÑÑÑока пеÑедаÑÑÑÑ ÑÑнкÑии ввода Ñелевого Ñипа. Ðо многиÑ
ÑлÑÑаÑÑ
ÑÑа возможноÑÑÑ Ð¸Ð·Ð±Ð°Ð²Ð»ÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи пиÑаÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑеÑ
Ñипов оÑделÑнÑе ÑÑнкÑии пÑиведениÑ. ÐÑеобÑазование ввода/вÑвода ÑабоÑÐ°ÐµÑ Ñак же, как и обÑÑное пÑиведение Ñ ÑÑнкÑией; оÑлиÑаеÑÑÑ ÑолÑко ÑеализаÑиÑ.
Ðо ÑмолÑаниÑ, пÑиведение можно вÑзваÑÑ, ÑолÑко запиÑав его Ñвно, Ñо еÑÑÑ Ð¿Ñименив конÑÑÑÑкÑÐ¸Ñ CAST( или x AS имÑ_Ñипа)x::имÑ_Ñипа.
ÐÑли пÑиведение помеÑено AS ASSIGNMENT, его можно вÑзÑваÑÑ Ð½ÐµÑвно, пÑиÑÐ²Ð°Ð¸Ð²Ð°Ñ Ð·Ð½Ð°Ñение ÑÑолбÑÑ Ñ ÑелевÑм Ñипом даннÑÑ
. ÐапÑимеÑ, еÑли foo.f1 â ÑÑÐ¾Ð»Ð±ÐµÑ Ñипа text, Ñо команда:
INSERT INTO foo (f1) VALUES (42);
бÑÐ´ÐµÑ Ð´Ð¾Ð¿ÑÑÑимой, еÑли пÑиведение Ñипа integer к text помеÑено AS ASSIGNMENT, и не бÑÐ´ÐµÑ Ð² пÑоÑивном ÑлÑÑае. (ÐÐ»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñакого Ñипа пÑиведений Ð¼Ñ Ð¾Ð±ÑÑно иÑполÑзÑем ÑеÑмин пÑиведение пÑиÑваиваниÑ.)
ÐÑли пÑиведение помеÑено AS IMPLICIT, оно бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð½ÐµÑвно в лÑбом конÑекÑÑе, бÑÐ´Ñ Ñо пÑиÑваивание или внÑÑÑеннее пÑеобÑазование в вÑÑажении. (ÐбÑÑно Ð¼Ñ Ð½Ð°Ð·ÑÐ²Ð°ÐµÑ Ð¿Ñиведение Ñакого Ñипа неÑвнÑм пÑиведением.) ÐапÑимеÑ, ÑаÑÑмоÑÑиÑе ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑ:
SELECT 2 + 4.0;
ÐÑи ÑазбоÑе запÑоÑа конÑÑанÑам ÑнаÑала назнаÑаÑÑÑÑ ÑÐ¸Ð¿Ñ integer и numeric. Ðднако в ÑиÑÑемнÑÑ
каÑалогаÑ
Ð½ÐµÑ Ð¾Ð¿ÐµÑаÑоÑа integer + numeric, Ñ
оÑÑ ÐµÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ numeric + numeric. Таким обÑазом, запÑÐ¾Ñ Ð²ÑполниÑÑÑ ÑÑпеÑно, еÑли ÑÑÑеÑÑвÑÐµÑ Ð¿ÑеобÑазование Ñипа integer к numeric Ñ Ð¿Ð¾Ð¼ÐµÑкой AS IMPLICIT â и на Ñамом деле ÑÑо Ñак. ÐнализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа пÑÐ¸Ð¼ÐµÐ½Ð¸Ñ Ð½ÐµÑвное пÑиведение и запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑабоÑан, как еÑли Ð±Ñ Ð¾Ð½ бÑл запиÑан в виде
SELECT CAST ( 2 AS numeric ) + 4.0;
СиÑÑемнÑе каÑалоги Ñакже ÑодеÑÐ¶Ð°Ñ Ð¿Ñиведение Ñипа numeric к integer. ÐÑли Ð±Ñ ÑÑо пÑиведение Ñоже бÑло Ð±Ñ Ð¿Ð¾Ð¼ÐµÑено AS IMPLICIT (на Ñамом деле ÑÑо не Ñак), анализаÑоÑÑ Ð·Ð°Ð¿ÑоÑа пÑиÑлоÑÑ Ð±Ñ Ð²ÑбиÑаÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑедÑдÑÑим ваÑианÑом и пÑиведением конÑÑанÑÑ numeric к ÑÐ¸Ð¿Ñ integer Ñ Ð¿Ð¾ÑледÑÑÑим пÑименением опеÑаÑоÑа integer + integer. Ðе Ð¸Ð¼ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи вÑбÑаÑÑ Ð»ÑÑÑий ваÑианÑ, анализаÑÐ¾Ñ Ð±Ñ Ð½Ðµ Ñмог ÑазÑеÑиÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¸ обÑÑвил Ð±Ñ ÐµÐ³Ð¾ неоднознаÑнÑм. Ðменно благодаÑÑ ÑомÑ, ÑÑо ÑолÑко одно из двÑÑ
пÑиведений Ñделано неÑвнÑм, анализаÑÐ¾Ñ Ð¿ÑиÑ
Ð¾Ð´Ð¸Ñ Ðº пониманиÑ, ÑÑо пÑедпоÑиÑаемÑм ÑвлÑеÑÑÑ Ð¿ÑеобÑазование вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ numeric-и-integer в numeric; оÑделÑного вÑÑÑоенного Ð·Ð½Ð°Ð½Ð¸Ñ Ð¾Ð± ÑÑом неÑ.
ÐпÑеделÑÑ, обÑÑвлÑÑÑ Ð»Ð¸ пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½ÐµÑвнÑми, ÑазÑмно пÑоÑвлÑÑÑ ÐºÐ¾Ð½ÑеÑваÑизм. ÐÑи ÑÑезмеÑном колиÑеÑÑве ÑпоÑобов неÑвного пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Postgres Pro Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбиÑаÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе инÑеÑпÑеÑаÑии команд, или вовÑе не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸Ð·-за налиÑÐ¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва возможнÑÑ
инÑеÑпÑеÑаÑий. Ðак пÑавило, ÑледÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð¿Ñиведение неÑвно вÑзÑваемÑм ÑолÑко Ð´Ð»Ñ Ð¿ÑеобÑазований, ÑоÑ
ÑанÑÑÑиÑ
инÑоÑмаÑиÑ, Ð¼ÐµÐ¶Ð´Ñ Ñипами в одной обÑей каÑегоÑии Ñипов. ÐапÑимеÑ, пÑиведение int2 к int4 ÑазÑмно ÑделаÑÑ Ð½ÐµÑвнÑм, но пÑиведение float8 к int4, возможно, лÑÑÑе ÑделаÑÑ ÑолÑко пÑиведением пÑиÑваиваниÑ. ÐÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñипов ÑазнÑÑ
каÑегоÑий, напÑимеÑ, text к int4, лÑÑÑе делаÑÑ ÑолÑко ÑвнÑми.
ÐÑимеÑание
Ðногда Ñади ÑдобÑÑва или ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑандаÑÑам ÑÑебÑеÑÑÑ Ð²Ð²ÐµÑÑи множеÑÑво неÑвнÑÑ Ð¿ÑеобÑазований Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ñипов, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº неизбежной неоднознаÑноÑÑи. ЧÑÐ¾Ð±Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа мог обеÑпеÑиÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ðµ поведение в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ , он дополниÑелÑно пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð²Ð¾ внимание каÑегоÑии Ñипов и пÑедпоÑиÑаемÑе ÑипÑ. ÐодÑобнее ÑÑо опиÑано в CREATE TYPE.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ñиведение, необÑ
одимо бÑÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем одного (иÑÑ
одного или Ñелевого) Ñипа и имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ð´ÑÑгого Ñипа. СоздаÑÑ Ð´Ð²Ð¾Ð¸Ñно-Ñводимое пÑиведение могÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели. (ÐÑо огÑаниÑение введено поÑомÑ, ÑÑо пÑеобÑазование даннÑÑ
Ñ Ð¾ÑибоÑнÑм двоиÑнÑм Ñведением Ð¼Ð¾Ð¶ÐµÑ Ð»ÐµÐ³ÐºÐ¾ вÑзÑваÑÑ Ñбой ÑеÑвеÑа.)
ÐаÑамеÑÑÑ
иÑÑ Ð¾Ð´Ð½Ñй_ÑипÐÐ¼Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ Ð´Ð»Ñ Ð¿ÑиведениÑ.
Ñелевой_ÑипÐÐ¼Ñ Ñелевого Ñипа даннÑÑ Ð´Ð»Ñ Ð¿ÑиведениÑ.
имÑ_ÑÑнкÑии(Ñип_аÑгÑменÑа[, ...])ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑиведениÑ. ÐÐ¼Ñ ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ ÐµÐ¼Ð¾Ð¹, в пÑоÑивном ÑлÑÑае Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ÑÑнкÑии пÑоÑмаÑÑиваеÑÑÑ Ð¿ÑÑÑ Ð¿Ð¾Ð¸Ñка. Тип даннÑÑ ÑезÑлÑÑаÑа должен ÑооÑвеÑÑÑвоваÑÑ ÑÐµÐ»ÐµÐ²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¿ÑиведениÑ. ÐÑгÑменÑÑ ÑÑнкÑии ÑаÑÑмаÑÑиваÑÑÑÑ Ð½Ð¸Ð¶Ðµ.
WITHOUT FUNCTIONÐбознаÑаеÑ, ÑÑо иÑÑ Ð¾Ð´Ð½Ñй Ñип ÑводиÑÑÑ Ðº ÑÐµÐ»ÐµÐ²Ð¾Ð¼Ñ Ð½Ð° двоиÑном ÑÑовне, Ñак ÑÑо ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ ÑÑебÑеÑÑÑ.
WITH INOUTÐбознаÑаеÑ, ÑÑо пÑиведение вÑполнÑеÑÑÑ ÐºÐ°Ðº пÑеобÑазование ввода/вÑвода, Ñо еÑÑÑ Ð²ÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ Ð²Ñвода иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ , а ÐµÑ ÑезÑлÑÑаÑ-ÑÑÑока пеÑедаÑÑÑÑ ÑÑнкÑии ввода Ñелевого Ñипа.
AS ASSIGNMENTÐбознаÑаеÑ, ÑÑо пÑиведение Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð½ÐµÑвно в конÑекÑÑе пÑиÑваиваниÑ.
AS IMPLICITÐбознаÑаеÑ, ÑÑо пÑиведение Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð½ÐµÑвно в лÑбом конÑекÑÑе.
ФÑнкÑии, ÑеализÑÑÑие пÑиведение, могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ до ÑÑÑÑ
аÑгÑменÑов. Тип пеÑвого аÑгÑменÑа должен бÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑен или двоиÑно-ÑводимÑм к иÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¿ÑиведениÑ. ÐÑоÑой аÑгÑменÑ, еÑли он еÑÑÑ, должен имеÑÑ Ñип integer; в нÑм пеÑедаÑÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¾Ñ Ñипа, ÑвÑзаннÑй Ñ ÑелевÑм Ñипом, или -1, еÑли он оÑÑÑÑÑÑвÑеÑ. ТÑеÑий аÑгÑменÑ, еÑли он еÑÑÑ, должен имеÑÑ Ñип boolean; в нÑм пеÑедаÑÑÑÑ true, еÑли пÑиведение вÑполнÑеÑÑÑ Ñвно, либо false в пÑоÑивном ÑлÑÑае. (ÐÑо доволÑно ÑкÑÑÑаваганÑно, но ÑÑандаÑÑ SQL пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ñазное поведение Ð´Ð»Ñ Ñвного и неÑвного пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² некоÑоÑÑÑ
ÑлÑÑаÑÑ
. ÐÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¿ÑедназнаÑен Ð´Ð»Ñ ÑÑнкÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ ÑеализовÑваÑÑ Ñакие пÑиведениÑ. Ðднако ÑоздаваÑÑ ÑобÑÑвеннÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑо имело Ð±Ñ Ð·Ð½Ð°Ñение, не ÑекомендÑеÑÑÑ.)
ÐозвÑаÑаемÑй Ñип ÑÑнкÑии пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑм или двоиÑно-ÑводимÑм к ÑÐµÐ»ÐµÐ²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¿ÑиведениÑ.
ÐбÑÑно иÑÑ Ð¾Ð´Ð½Ñй и Ñелевой ÑÐ¸Ð¿Ñ Ð² пÑиведении ÑазлиÑаÑÑÑÑ, однако можно обÑÑвиÑÑ Ð¿Ñиведение одного Ñипа к ÑÐ°ÐºÐ¾Ð¼Ñ Ð¶Ðµ, еÑли ÑÑнкÑиÑ, ÑеализÑÑÑÐ°Ñ Ð¿ÑеобÑазование, Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÐµÐµ одного аÑгÑменÑа. ÐÑо иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑиÑÑемнÑÑ ÐºÐ°ÑÐ°Ð»Ð¾Ð³Ð°Ñ ÑÑнкÑий, ÑводÑÑÐ¸Ñ ÑазнÑе Ð´Ð»Ð¸Ð½Ñ Ñипов. РеализÑÑÑÐ°Ñ Ñакое пÑиведение ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ ÑводиÑÑ Ð·Ð½Ð°Ñение Ñипа к знаÑÐµÐ½Ð¸Ñ Ñ Ð¾Ð¿ÑеделÑннÑм модиÑикаÑоÑом, Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð²ÑоÑÑм аÑгÑменÑом.
Ðогда иÑÑ Ð¾Ð´Ð½Ñй и Ñелевой ÑÐ¸Ð¿Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑазлиÑаÑÑÑÑ Ð¸ ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð±Ð¾Ð»ÐµÐµ одного аÑгÑменÑа, пÑеобÑазование Ñипа из одного в дÑÑгой и Ñведение к нÑжной длине Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð·Ð° один Ñаг. ÐÑли же ÑооÑвеÑÑÑвÑÑÑей запиÑи не Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ, пÑиведение к ÑÐ¸Ð¿Ñ Ñ Ð¾Ð¿ÑеделÑннÑм модиÑикаÑоÑом вÑполнÑеÑÑÑ Ð² два ÑÑапа: ÑнаÑала вÑполнÑеÑÑÑ Ð¿ÑеобÑазование Ñипа, а заÑем пÑименÑеÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¾Ñ Ñипа.
ÐÑиведение Ñипа домена или к ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ оÑÑÑеÑÑвлÑеÑÑÑ. ÐÑи попÑÑке вÑполниÑÑ Ñакое пÑиведение вмеÑÑо него вÑполнÑеÑÑÑ Ð¿Ñиведение, ÑвÑзанное Ñ Ð±Ð°Ð·Ð¾Ð²Ñм Ñипом домена.
ÐамеÑаниÑ
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñиведений, ÑозданнÑÑ Ð¿Ð¾Ð»ÑзоваÑелем, пÑименÑеÑÑÑ DROP CAST.
ÐомниÑе, ÑÑо когда ÑÑебÑеÑÑÑ Ð¿ÑеобÑазовÑваÑÑ ÑÐ¸Ð¿Ñ Ð² обе ÑÑоÑонÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ñвно опиÑаÑÑ Ð´Ð²Ð° пÑиведениÑ.
ÐбÑÑно не ÑÑебÑеÑÑÑ ÑоздаваÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкими Ñипами и ÑÑандаÑÑнÑми ÑÑÑоковÑми Ñипами (text, varchar и char(, а Ñакже полÑзоваÑелÑÑкими Ñипами, оÑноÑÑÑимиÑÑ Ðº каÑегоÑии ÑÑÑоковÑÑ
). ÐÐ»Ñ Ð½Ð¸Ñ
Postgres Pro пÑедоÑÑавлÑÐµÑ Ð°Ð²ÑомаÑиÑеÑкое пÑеобÑазование ввода/вÑвода. ÐвÑомаÑиÑеÑкие пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ðº ÑÑÑоковÑм Ñипам ÑÑиÑаÑÑÑÑ Ð¿ÑиведениÑми пÑиÑваиваниÑ, а авÑомаÑиÑеÑкие пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑÑоковÑÑ
Ñипов к дÑÑгим могÑÑ Ð±ÑÑÑ ÑолÑко ÑвнÑми. ÐÑо поведение можно пеÑеопÑеделиÑÑ, Ñоздав ÑобÑÑвенное пÑиведение, заменÑÑÑее авÑомаÑиÑеÑкое, но обÑÑно ÑÑо нÑжно, ÑолÑко ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð²Ñзов более ÑдобнÑм, Ñем ÑÑандаÑÑное ÑолÑко пÑиÑваивание или Ñвное Ñказание. Ðозможен и дÑÑгой повод Ð´Ð»Ñ Ñакого пеÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ â желание ÑоздаÑÑ Ð¿Ñиведение, ÑабоÑаÑÑее не Ñак, как ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð°/вÑвода Ñипа; но ÑÑо наÑÑолÑко ÑдивиÑелÑно, ÑÑо ÑледÑÐµÑ Ð´Ð²Ð°Ð¶Ð´Ñ Ð¿Ð¾Ð´ÑмаÑÑ, Ñ
оÑоÑа ли ÑÑа идеÑ. (Ðа Ñамом деле Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑого колиÑеÑÑва вÑÑÑоеннÑÑ
Ñипов имеÑÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑпеÑиÑиÑеÑкие пÑиведениÑ, в оÑновном из-за ÑÑебований ÑÑандаÑÑа SQL.)n)
ХоÑÑ ÑÑо и не обÑзаÑелÑно, но ÑекомендÑеÑÑÑ ÑледоваÑÑ ÑÑаÑÐ¾Ð¼Ñ ÑоглаÑÐµÐ½Ð¸Ñ Ð½Ð°Ð·ÑваÑÑ ÑÑнкÑии, ÑеализÑÑÑие пÑиведение, по ÑÐµÐ»ÐµÐ²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
. Ðногие пÑивÑкли вÑполнÑÑÑ Ð¿ÑеобÑазование Ñипов даннÑÑ
, запиÑÑÐ²Ð°Ñ ÐµÐ³Ð¾ в ÑÑиле ÑÑнкÑий, Ñ. е. имÑ_Ñипа(x). ÐÑа запиÑÑ Ð½Ð° Ñамом деле ни болÑÑе ни менÑÑе как пÑоÑÑо вÑзов ÑÑнкÑии, ÑеализÑÑÑей пÑиведение; Ñакой вÑзов не воÑпÑинимаеÑÑÑ ÐºÐ°Ðº именно пÑиведение. ÐÑли назÑваÑÑ ÑÑнкÑии, не ÑледÑÑ ÑÑÐ¾Ð¼Ñ ÑоглаÑениÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñм Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей. Так как Postgres Pro позволÑÐµÑ Ð¿ÐµÑегÑÑжаÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же Ð¸Ð¼Ñ ÑÑнкÑии Ñ ÑазнÑми Ñипами аÑгÑменÑов, ниÑÑо не меÑÐ°ÐµÑ ÑоздаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑнкÑий пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑазнÑÑ
Ñипов к одномÑ, названнÑÑ
по имени ÑÑого Ñелевого Ñипа.
ÐÑимеÑание
ÐообÑе говоÑÑ, в пÑедÑдÑÑем абзаÑе допÑÑено некоÑоÑое ÑпÑоÑение: еÑÑÑ Ð´Ð²Ð° ÑлÑÑаÑ, когда конÑÑÑÑкÑÐ¸Ñ Ñ Ð²Ñзовом ÑÑнкÑии иÑполнÑеÑÑÑ ÐºÐ°Ðº пÑиведение, без ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ ÑакÑиÑеÑкой ÑÑнкÑией. ÐÑли вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии имÑ(x) в ÑоÑноÑÑи не ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑÑнкÑиÑ, но имееÑÑÑ Ñип даннÑÑ
Ð¸Ð¼Ñ Ð¸ в pg_cast еÑÑÑ Ð´Ð²Ð¾Ð¸Ñно-Ñводимое пÑиведение Ñипа x к ÑÑÐ¾Ð¼Ñ ÑипÑ, Ñакой вÑзов бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинÑÑ ÐºÐ°Ðº пÑиведение. ÐÑо иÑклÑÑение введено, ÑÑÐ¾Ð±Ñ Ð´Ð²Ð¾Ð¸Ñно-Ñводимое пÑиведение можно бÑло вÑзÑваÑÑ, иÑполÑзÑÑ ÑинÑакÑÐ¸Ñ ÑÑнкÑий, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо никакой ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð½ÐµÐ³Ð¾ неÑ. ÐналогиÑно, еÑли запиÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² pg_cast оÑÑÑÑÑÑвÑеÑ, но в ÑлÑÑае пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑо бÑло Ð±Ñ Ð¿ÑеобÑазование в/из ÑÑÑокового Ñипа, Ñакой вÑзов бÑÐ´ÐµÑ Ð²Ñполнен как пÑеобÑазование ввода/вÑвода. ÐÑо иÑклÑÑение позволÑÐµÑ Ð²ÑзÑваÑÑ Ð¿ÑеобÑазование ввода/вÑвода, иÑполÑзÑÑ ÑинÑакÑÐ¸Ñ Ð²Ñзова ÑÑнкÑии.
ÐÑимеÑание
Ðо еÑÑÑ Ð¸ÑклÑÑение и из ÑÑого иÑклÑÑениÑ: пÑеобÑазование ввода/вÑвода из ÑоÑÑавнÑÑ
Ñипов в ÑÑÑоковÑе нелÑÐ·Ñ Ð²ÑзваÑÑ Ð² виде ÑÑнкÑии, его необÑ
одимо запиÑаÑÑ ÐºÐ°Ðº Ñвное пÑиведение (иÑполÑзÑÑ CAST или запиÑÑ ::). ÐÑо иÑклÑÑение бÑло добавлено, поÑÐ¾Ð¼Ñ ÑÑо поÑле Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки пÑедоÑÑавлÑемÑÑ
пÑеобÑазований ввода/вÑвода, оказалоÑÑ ÑлиÑком легко ÑлÑÑайно вÑзваÑÑ Ñакое пÑиведение, Ñогда как имелаÑÑ Ð² Ð²Ð¸Ð´Ñ ÑÑÑлка на ÑÑÐ¾Ð»Ð±ÐµÑ Ð¸Ð»Ð¸ ÑÑнкÑиÑ.
ÐÑимеÑÑ
Создание пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿ÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ñипа bigint к ÑÐ¸Ð¿Ñ int4 Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии int4(bigint):
CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;
(ÐÑо пÑиведение Ñже пÑедопÑеделено в ÑиÑÑеме.)
СовмеÑÑимоÑÑÑ
Ðоманда CREATE CAST ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL, за иÑклÑÑением Ñого, ÑÑо в ÑÑандаÑÑе ниÑего не говоÑиÑÑÑ Ð¾ двоиÑно-ÑводимÑÑ
ÑипаÑ
и дополниÑелÑнÑÑ
аÑгÑменÑаÑ
ÑеализÑÑÑиÑ
ÑÑнкÑий. Указание AS IMPLICIT Ñоже ÑвлÑеÑÑÑ ÑаÑÑиÑением Postgres Pro.