44.1. ФÑнкÑии на PL/Perl и Ð¸Ñ Ð°ÑгÑменÑÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð½Ð° ÑзÑке PL/Perl, иÑполÑзÑйÑе ÑÑандаÑÑнÑй ÑинÑакÑÐ¸Ñ CREATE FUNCTION:
CREATE FUNCTIONимÑ_ÑÑнкÑии(ÑипÑ-аÑгÑменÑов) RETURNSÑип-ÑезÑлÑÑаÑа-- здеÑÑ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð°ÑÑибÑÑÑ ÑÑнкÑии AS $$ # Тело ÑÑнкÑии на PL/Perl $$ LANGUAGE plperl;
Тело ÑÑнкÑии ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±ÑÑнÑй код Perl. ФакÑиÑеÑки, код обвÑзки PL/Perl помеÑÐ°ÐµÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ в подпÑогÑÐ°Ð¼Ð¼Ñ Perl. ФÑнкÑÐ¸Ñ PL/Perl вÑзÑваеÑÑÑ Ð² ÑкалÑÑном конÑекÑÑе, Ñак ÑÑо она не Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ ÑпиÑок. Ðе ÑкалÑÑнÑе знаÑÐµÐ½Ð¸Ñ (маÑÑивÑ, запиÑи и множеÑÑва) можно веÑнÑÑÑ Ð¿Ð¾ ÑÑÑлке, как опиÑÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ.
РпÑоÑедÑÑе PL/Perl возвÑаÑаемое из кода Perl знаÑение игноÑиÑÑеÑÑÑ.
PL/Perl Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе блоки кода, коÑоÑÑе вÑполнÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑом DO:
DO $$
# Ðод PL/Perl
$$ LANGUAGE plperl;ÐнонимнÑй блок кода не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð°ÑгÑменÑÑ, а лÑбое знаÑение, коÑоÑое он мог Ð±Ñ Ð²ÐµÑнÑÑÑ, оÑбÑаÑÑваеÑÑÑ. РоÑÑалÑном он ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÐºÐ¾Ð´Ñ ÑÑнкÑии.
ÐÑимеÑание
ÐÑполÑзоваÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе именованнÑе подпÑогÑÐ°Ð¼Ð¼Ñ Ð² Perl опаÑно, оÑобенно еÑли они обÑаÑаÑÑÑÑ Ðº лекÑиÑеÑким пеÑеменнÑм в окÑÑжаÑÑей облаÑÑи. Так как ÑÑнкÑÐ¸Ñ PL/Perl обоÑаÑиваеÑÑÑ Ð² подпÑогÑаммÑ, лÑÐ±Ð°Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð½ÑÑÑи Ð½ÐµÑ Ð±ÑÐ´ÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¹. ÐообÑе гоÑаздо безопаÑнее ÑоздаваÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе подпÑогÑÐ°Ð¼Ð¼Ñ Ð¸ вÑзÑваÑÑ Ð¸Ñ
по ÑÑÑлке на код. ÐополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð½Ð° ÑÑÑаниÑе ÑÑководÑÑва man perldiag, в опиÑании оÑибок Variable "%s" will not stay shared (ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ "%s" не оÑÑанеÑÑÑ ÑазделÑемой) и Variable "%s" is not available (ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ "%s" недоÑÑÑпна), либо найÑи в ÐнÑеÑнеÑе по клÑÑевÑм Ñловам «perl nested named subroutine» (perl Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿ÑогÑамма).
СинÑакÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE FUNCTION ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ñело ÑÑнкÑии бÑло запиÑано как ÑÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа. ÐбÑÑно Ð´Ð»Ñ ÑÑого Ñдобнее вÑего заклÑÑаÑÑ ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑÑ Ð² доллаÑÑ (Ñм. ÐодÑаздел 4.1.2.4). ÐÑли Ð²Ñ ÑеÑиÑе пÑименÑÑÑ ÑинÑакÑÐ¸Ñ ÑпеÑпоÑледоваÑелÑноÑÑей E'', вам пÑидÑÑÑÑ Ð´ÑблиÑоваÑÑ Ð°Ð¿Ð¾ÑÑÑоÑÑ (') и обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ (\) в Ñеле ÑÑнкÑии (Ñм. ÐодÑаздел 4.1.2.1).
ÐÑгÑменÑÑ Ð¸ ÑезÑлÑÑÐ°Ñ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº и в лÑбой дÑÑгой подпÑогÑамме на Perl: аÑгÑменÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð² @_, а ÑезÑлÑÑиÑÑÑÑим знаÑением бÑÐ´ÐµÑ Ñказанное в return или полÑÑенное в поÑледнем вÑÑажении, вÑÑиÑленном в ÑÑнкÑии.
ÐапÑимеÑ, ÑÑнкÑиÑ, возвÑаÑаÑÑÑÑ Ð±Ð¾Ð»ÑÑее из двÑÑ ÑелÑÑ ÑиÑел, можно опÑеделиÑÑ Ñак:
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
if ($_[0] > $_[1]) { return $_[0]; }
return $_[1];
$$ LANGUAGE plperl;ÐÑимеÑание
ÐÑгÑменÑÑ Ð±ÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð¸Ð· кодиÑовки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² UTF-8 Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² PL/Perl, а пÑи вÑÑ Ð¾Ð´Ðµ Ñнова бÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð¸Ð· UTF-8 в кодиÑÐ¾Ð²ÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐÑли ÑÑнкÑии пеÑедаÑÑÑÑ NULL-знаÑение SQL, знаÑением аÑгÑменÑа в Perl ÑÑÐ°Ð½ÐµÑ Â«undefined». Ðоказанное вÑÑе опÑеделение ÑÑнкÑии бÑÐ´ÐµÑ Ð½Ðµ оÑÐµÐ½Ñ Ñ
оÑоÑо обÑабаÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL (в дейÑÑвиÑелÑноÑÑи они бÑдÑÑ Ð²Ð¾ÑпÑинÑÑÑ ÐºÐ°Ðº нÑли). ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ñказание STRICT в ÑÑо опÑеделение, ÑÑÐ¾Ð±Ñ Postgres Pro поÑÑÑпал немного ÑазÑмнее: пÑи пеÑедаÑе знаÑÐµÐ½Ð¸Ñ NULL ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð²Ñе не бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ, бÑÐ´ÐµÑ ÑÑÐ°Ð·Ñ Ð²Ð¾Ð·Ð²ÑаÑÑн ÑезÑлÑÑÐ°Ñ NULL. С дÑÑгой ÑÑоÑонÑ, Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿ÑовеÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ undefined в Ñеле ÑÑнкÑии. ÐапÑимеÑ, пÑедположим, ÑÑо нам нÑжна ÑÑнкÑÐ¸Ñ perl_max, коÑоÑÐ°Ñ Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом NULL и вÑоÑÑм аÑгÑменÑом не NULL должна возвÑаÑаÑÑ Ð½Ðµ NULL, а вÑоÑой аÑгÑменÑ:
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
my ($x, $y) = @_;
if (not defined $x) {
return undef if not defined $y;
return $y;
}
return $x if not defined $y;
return $x if $x > $y;
return $y;
$$ LANGUAGE plperl;Ðак показано вÑÑе, ÑÑÐ¾Ð±Ñ Ð²ÑдаÑÑ Ð·Ð½Ð°Ñение SQL NULL, нÑжно веÑнÑÑÑ Ð·Ð½Ð°Ñение undefined. ÐÑо можно ÑделаÑÑ Ð¸ в ÑÑÑогой, и в неÑÑÑогой ÑÑнкÑии.
ÐÑÑ Ð² аÑгÑменÑаÑ
ÑÑнкÑии, ÑÑо не ÑвлÑеÑÑÑ ÑÑÑлкой, ÑвлÑеÑÑÑ ÑÑÑокой, Ñо еÑÑÑ ÑÑандаÑÑнÑм Ð´Ð»Ñ Postgres Pro внеÑним ÑекÑÑовÑм пÑедÑÑавлением ÑооÑвеÑÑÑвÑÑÑего Ñипа даннÑÑ
. Ð ÑлÑÑае Ñ Ð¾Ð±ÑÑнÑми ÑиÑловÑми или ÑекÑÑовÑми Ñипами, Perl пÑоÑÑо воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸Ñ
должнÑм обÑазом, и пÑогÑаммиÑÑ, как пÑавило, Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð± ÑÑом не дÑмаÑÑ. Ðднако в более ÑложнÑÑ
ÑлÑÑаÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¿ÑеобÑазоваÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð² ÑоÑмÑ, подÑ
одÑÑÑÑ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Perl. ÐапÑимеÑ, Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипа bytea в двоиÑное знаÑение можно иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ decode_bytea.
ÐналогиÑно, знаÑениÑ, пеÑедаваемÑе в Postgres Pro, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð² ÑоÑмаÑе внеÑнего ÑекÑÑового пÑедÑÑавлениÑ. ÐапÑимеÑ, Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки двоиÑнÑÑ
даннÑÑ
к возвÑаÑÑ Ð² знаÑении bytea можно воÑполÑзоваÑÑÑÑ ÑÑнкÑией encode_bytea.
ÐÑобого Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð·Ð°ÑлÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ Ñ Ð»Ð¾Ð³Ð¸ÑеÑкими знаÑениÑми. Ðак ÑолÑко ÑÑо бÑло Ñказано, по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ bool пеÑедаÑÑÑÑ Ð² Perl в ÑекÑÑовом виде, Ñо еÑÑÑ ÐºÐ°Ðº 't' или 'f'. РздеÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñоблема, Ñак как Perl не бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинимаÑÑ 'f' как false! УлÑÑÑиÑÑ ÑиÑÑаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾, воÑполÑзовавÑиÑÑ Â«ÑÑанÑÑоÑмаÑией» (Ñм. CREATE TRANSFORM). ÐÑжнÑе ÑÑанÑÑоÑмаÑии ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑаÑÑиÑении bool_plperl. ЧÑÐ¾Ð±Ñ Ð¿ÑимениÑÑ Ð¸Ñ
, ÑÑÑановиÑе ÑаÑÑиÑение:
CREATE EXTENSION bool_plperl; -- или bool_plperlu Ð´Ð»Ñ PL/PerlU
ÐаÑем иÑполÑзÑйÑе аÑÑибÑÑ TRANSFORM Ð´Ð»Ñ ÑÑнкÑии на PL/Perl, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸Ð»Ð¸ вÑдаÑÑ bool, напÑимеÑ:
CREATE FUNCTION perl_and(bool, bool) RETURNS bool TRANSFORM FOR TYPE bool AS $$ my ($a, $b) = @_; return $a && $b; $$ LANGUAGE plperl;
Ðогда бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑÑа ÑÑанÑÑоÑмаÑиÑ, Perl бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð°ÑгÑменÑÑ bool как 1 или пÑÑÑое знаÑение, ÑÑо Ð´Ð»Ñ Perl бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº true или false. ÐÑли ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ñипа bool, бÑÐ´ÐµÑ Ð²ÑдаваÑÑÑÑ Ð·Ð½Ð°Ñение true или false, в завиÑимоÑÑи Ð¾Ñ Ñого, ÑÑиÑаеÑÑÑ Ð»Ð¸ в Perl ÑезÑлÑÑÐ°Ñ Ð¸ÑÑиннÑм или неÑ. ÐодобнÑе ÑÑанÑÑоÑмаÑии Ñакже вÑполнÑÑÑÑÑ Ð´Ð»Ñ Ð°ÑгÑменÑов и ÑезÑлÑÑаÑов SPI-запÑоÑов, вÑполнÑемÑÑ
внÑÑÑи ÑÑнкÑии (ÐодÑаздел 44.3.1).
Perl Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ PostgreSQL как ÑÑÑлки на маÑÑÐ¸Ð²Ñ Perl. ÐапÑимеÑ, Ñак:
CREATE OR REPLACE function returns_array()
RETURNS text[][] AS $$
return [['a"b','c,d'],['e\\f','g']];
$$ LANGUAGE plperl;
select returns_array();Perl пеÑедаÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ PostgreSQL как обÑекÑ, ÑопоÑÑавленнÑй Ñ PostgreSQL::InServer::ARRAY. С ÑÑим обÑекÑом можно ÑабоÑаÑÑ ÐºÐ°Ðº Ñо ÑÑÑлкой на маÑÑив или ÑÑÑокой, ÑÑо допÑÑÐºÐ°ÐµÑ Ð¾Ð±ÑаÑнÑÑ ÑовмеÑÑимоÑÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ Perl, напиÑаннÑм Ð´Ð»Ñ PostgreSQL веÑÑии до 9.1. ÐапÑимеÑ:
CREATE OR REPLACE FUNCTION concat_array_elements(text[]) RETURNS TEXT AS $$
my $arg = shift;
my $result = "";
return undef if (!defined $arg);
# в каÑеÑÑве ÑÑÑлки на маÑÑив
for (@$arg) {
$result .= $_;
}
# Ñакже ÑабоÑÐ°ÐµÑ Ñо ÑÑÑокой
$result .= $arg;
return $result;
$$ LANGUAGE plperl;
SELECT concat_array_elements(ARRAY['PL','/','Perl']);ÐÑимеÑание
ÐногомеÑнÑе маÑÑÐ¸Ð²Ñ Ð¿ÑедÑÑавлÑÑÑÑÑ ÐºÐ°Ðº ÑÑÑлки на маÑÑÐ¸Ð²Ñ Ð¼ÐµÐ½ÑÑей ÑазмеÑноÑÑи Ñо ÑÑÑлками â ÑÑÐ¾Ñ ÑпоÑоб Ñ Ð¾ÑоÑо знаком ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¿ÑогÑаммиÑÑÑ Ð½Ð° Perl.
ÐÑгÑменÑÑ ÑоÑÑавного Ñипа пеÑедаÑÑÑÑ ÑÑнкÑии как ÑÑÑлки на Ñ ÐµÑи. ÐлÑÑами Ñ ÐµÑа ÑвлÑÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð° аÑÑибÑÑов ÑоÑÑавного Ñипа. ÐапÑимеÑ:
CREATE TABLE employee (
name text,
basesalary integer,
bonus integer
);
CREATE FUNCTION empcomp(employee) RETURNS integer AS $$
my ($emp) = @_;
return $emp->{basesalary} + $emp->{bonus};
$$ LANGUAGE plperl;
SELECT name, empcomp(employee.*) FROM employee;ФÑнкÑÐ¸Ñ Ð½Ð° PL/Perl Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ ÑезÑлÑÑÐ°Ñ ÑоÑÑавного Ñипа, пÑименÑÑ ÑÐ¾Ñ Ð¶Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´: возвÑаÑиÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° Ñ ÐµÑ Ñ ÑÑебÑемÑми аÑÑибÑÑами. ÐапÑимеÑ, Ñак:
CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);
CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
return {f2 => 'hello', f1 => 1, f3 => 'world'};
$$ LANGUAGE plperl;
SELECT * FROM perl_row();СÑолбÑÑ Ð¾Ð±ÑÑвленного Ñипа ÑезÑлÑÑаÑа, оÑÑÑÑÑÑвÑÑÑие в Ñ ÐµÑе, бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ ÐºÐ°Ðº знаÑÐµÐ½Ð¸Ñ NULL.
ÐодобнÑм обÑазом в виде ÑÑÑлки на Ñ ÐµÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð²ÑÑ Ð¾Ð´Ð½Ñе аÑгÑменÑÑ Ð¿ÑоÑедÑÑÑ:
CREATE PROCEDURE perl_triple(INOUT a integer, INOUT b integer) AS $$
my ($a, $b) = @_;
return {a => $a * 3, b => $b * 3};
$$ LANGUAGE plperl;
CALL perl_triple(5, 10);ФÑнкÑии на PL/Perl могÑÑ Ñакже возвÑаÑаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑва Ñо ÑкалÑÑнÑми или ÑоÑÑавнÑми Ñипами. ÐбÑÑно желаÑелÑно возвÑаÑаÑÑ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾ одной ÑÑÑоке, ÑÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑоÑонÑ, и ÑÑÐ¾Ð±Ñ Ð½Ðµ поÑÑебовалоÑÑ Ð½Ð°ÐºÐ°Ð¿Ð»Ð¸Ð²Ð°ÑÑ Ð²ÐµÑÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
в памÑÑи, Ñ Ð´ÑÑгой. ÐÑо можно ÑеализоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии return_next, как показано ниже. ÐамеÑÑÑе, ÑÑо поÑле поÑледнего вÑзова return_next, нÑжно помеÑÑиÑÑ return или (ÑÑо лÑÑÑе) return undef.
CREATE OR REPLACE FUNCTION perl_set_int(int)
RETURNS SETOF INTEGER AS $$
foreach (0..$_[0]) {
return_next($_);
}
return undef;
$$ LANGUAGE plperl;
SELECT * FROM perl_set_int(5);
CREATE OR REPLACE FUNCTION perl_set()
RETURNS SETOF testrowperl AS $$
return_next({ f1 => 1, f2 => 'Hello', f3 => 'World' });
return_next({ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' });
return_next({ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' });
return undef;
$$ LANGUAGE plperl;ÐÐ»Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ¸Ñ Ð½Ð°Ð±Ð¾Ñов даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже веÑнÑÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° маÑÑив, ÑодеÑжаÑий ÑкалÑÑÑ, ÑÑÑлки на маÑÑивÑ, либо ÑÑÑлки на Ñ ÐµÑи Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ Ñипов, Ñипов маÑÑивов и ÑоÑÑавнÑÑ Ñипов, ÑооÑвеÑÑÑвенно. Ðиже пÑиведена паÑа пÑоÑÑÑÑ Ð¿ÑимеÑов, показÑваÑÑÐ¸Ñ , как возвÑаÑиÑÑ Ð²ÐµÑÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² виде ÑÑÑлки на маÑÑив:
CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
return [0..$_[0]];
$$ LANGUAGE plperl;
SELECT * FROM perl_set_int(5);
CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
return [
{ f1 => 1, f2 => 'Hello', f3 => 'World' },
{ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
{ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
];
$$ LANGUAGE plperl;
SELECT * FROM perl_set();ÐÑли Ð²Ñ Ñ
оÑиÑе иÑполÑзоваÑÑ Ð² ÑвоÑм коде strict, Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð½ÐµÑколÑко ваÑианÑов. ÐÐ»Ñ Ð²Ñеменного глобалÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе задаÑÑ Ð´Ð»Ñ plperl.use_strict знаÑение true командой SET. ÐÑо повлиÑÐµÑ Ð½Ð° компилиÑÑемÑе впоÑледÑÑвии ÑÑнкÑии PL/Perl, но не на ÑÑнкÑии, Ñже ÑкомпилиÑованнÑе в ÑекÑÑем ÑеанÑе. ÐÐ»Ñ Ð¿Ð¾ÑÑоÑнного глобалÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑиÑвоиÑÑ Ð¿Ð°ÑамеÑÑÑ plperl.use_strict знаÑение true в Ñайле postgresql.conf.
ÐÐ»Ñ Ð¿Ð¾ÑÑоÑнного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ strict в опÑедÑлÑннÑÑ ÑÑнкÑиÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоÑÑо напиÑаÑÑ:
use strict;
в наÑале Ñела ÑÑÐ¸Ñ ÑÑнкÑий.
ÐÑ Ñакже можеÑе иÑполÑзоваÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ feature в use, еÑли иÑполÑзÑеÑе Perl веÑÑии 5.10.0 или новее.