41.2. ФÑнкÑии на PL/Tcl и Ð¸Ñ Ð°ÑгÑменÑÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð½Ð° ÑзÑке PL/Tcl, иÑполÑзÑйÑе ÑÑандаÑÑнÑй ÑинÑакÑÐ¸Ñ CREATE FUNCTION:
CREATE FUNCTIONимÑ_ÑÑнкÑии(ÑипÑ_аÑгÑменÑов) RETURNSÑип_ÑезÑлÑÑаÑаAS $$ # Тело ÑÑнкÑии на PL/Tcl $$ LANGUAGE pltcl;
С PL/TclU команда Ñа же, но в каÑеÑÑве ÑзÑка должно бÑÑÑ Ñказано pltclu.
Тело ÑÑнкÑии ÑодеÑÐ¶Ð¸Ñ Ð¿ÑоÑÑо ÑкÑÐ¸Ð¿Ñ Ð½Ð° Tcl. Ðогда вÑзÑваеÑÑÑ ÑÑнкÑиÑ, знаÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов пеÑедаÑÑÑÑ ÑкÑипÑÑ Tcl в виде пеÑеменнÑÑ
$1 ... $. РезÑлÑÑÐ°Ñ Ð¸Ð· кода Tcl возвÑаÑаеÑÑÑ ÐºÐ°Ðº обÑÑно, опеÑаÑоÑом nreturn.
ÐапÑимеÑ, ÑÑнкÑиÑ, возвÑаÑаÑÑÑÑ Ð±Ð¾Ð»ÑÑее из двÑÑ ÑелÑÑ ÑиÑел, можно опÑеделиÑÑ Ñак:
CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
if {$1 > $2} {return $1}
return $2
$$ LANGUAGE pltcl STRICT; ÐбÑаÑиÑе внимание на пÑедложение STRICT, коÑоÑое избавлÑÐµÑ Ð½Ð°Ñ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи дÑмаÑÑ Ð¾ вÑ
одÑÑиÑ
знаÑениÑÑ
NULL: еÑли пÑи вÑзове пеÑедаÑÑÑÑ Ð·Ð½Ð°Ñение NULL, ÑÑнкÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð²Ð¾Ð²Ñе, бÑÐ´ÐµÑ ÑÑÐ°Ð·Ñ Ð²Ð¾Ð·Ð²ÑаÑÑн ÑезÑлÑÑÐ°Ñ NULL.
РнеÑÑÑогой ÑÑнкÑии, еÑли ÑакÑиÑеÑкое знаÑение аÑгÑменÑа â NULL, ÑооÑвеÑÑÑвÑÑÑей пеÑеменной $ бÑÐ´ÐµÑ Ð¿ÑиÑвоена пÑÑÑÐ°Ñ ÑÑÑока. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, бÑл ли пеÑедан NULL в опÑеделÑнном аÑгÑменÑе, иÑполÑзÑйÑе ÑÑнкÑÐ¸Ñ nargisnull. ÐапÑимеÑ, пÑедположим, ÑÑо нам нÑжна ÑÑнкÑÐ¸Ñ tcl_max, коÑоÑÐ°Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом NULL и вÑоÑÑм аÑгÑменÑом не NULL должна возвÑаÑаÑÑ Ð½Ðµ NULL, а вÑоÑой аÑгÑменÑ:
CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
if {[argisnull 1]} {
if {[argisnull 2]} { return_null }
return $2
}
if {[argisnull 2]} { return $1 }
if {$1 > $2} {return $1}
return $2
$$ LANGUAGE pltcl;Ðак показано вÑÑе, ÑÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑ Ð·Ð½Ð°Ñение NULL из ÑÑнкÑии PL/Tcl, нÑжно вÑполниÑÑ return_null. ÐÑо можно ÑделаÑÑ Ð¸ в ÑÑÑогой, и в неÑÑÑогой ÑÑнкÑии.
ÐÑгÑменÑÑ ÑоÑÑавного Ñипа пеÑедаÑÑÑÑ ÑÑнкÑии в виде маÑÑивов Tcl. Ðменами ÑлеменÑов маÑÑива ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð° аÑÑибÑÑов ÑоÑÑавного Ñипа. ÐÑли аÑÑибÑÑ Ð² пеÑеданной ÑÑÑоке Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение NULL, он бÑÐ´ÐµÑ Ð¾ÑÑÑÑÑÑвоваÑÑ Ð² данном маÑÑиве. ÐапÑимеÑ:
CREATE TABLE employee (
name text,
salary integer,
age integer
);
CREATE FUNCTION overpaid(employee) RETURNS boolean AS $$
if {200000.0 < $1(salary)} {
return "t"
}
if {$1(age) < 30 && 100000.0 < $1(salary)} {
return "t"
}
return "f"
$$ LANGUAGE pltcl;РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð²Ð¾Ð·Ð²ÑÐ°Ñ ÑезÑлÑÑаÑов ÑоÑÑавного Ñипа не поддеÑживаеÑÑÑ, как и возвÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑв.
PL/Tcl в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð½Ñе ÑипÑ: он воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð¾Ð¼ÐµÐ½ как нижележаÑий ÑкалÑÑнÑй Ñип. ÐÑо ознаÑаеÑ, ÑÑо огÑаниÑениÑ, ÑвÑзаннÑе Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼, не бÑдÑÑ Ð´ÐµÐ¹ÑÑвоваÑÑ. ÐÑо не пÑоблема Ð´Ð»Ñ Ð°ÑгÑменÑов ÑÑнкÑии, но пÑедÑÑавлÑÐµÑ Ð¾Ð¿Ð°ÑноÑÑÑ, когда ÑÑнкÑÐ¸Ñ PL/Tcl обÑÑвлена как возвÑаÑаÑÑÐ°Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ñй Ñип.