元の試み:
変数$1
は、Perlではplpgsql関数とは異なる意味を持ちます。試す
CREATE OR REPLACE FUNCTION perl_func(VARIADIC params character varying[])
RETURNS character varying AS
$BODY$
use strict;
use warnings;
my $val = join("###",@_);
my $s = `echo $val`;
chomp($s);
return $s;
$BODY$
LANGUAGE plperlu VOLATILE
COST 100;
残念ながら、これは文字列を適切に分割しないため、(以下に示すように)機能しません。残念ながら、plperlは引数を単一の文字列と見なします。
CREATE OR REPLACE FUNCTION perl_str(VARIADIC text[])
RETURNS text AS
$BODY$
use strict;
use warnings;
my $array_str=shift;
return $array_str;
$BODY$
LANGUAGE plperl VOLATILE;
そしてそれを選択すると:
> select perl_str(ARRAY['abc','def']);
perl_str
-----------
{abc,def}
(1 row)
そして、それが単一の文字列であることを確実に知るために、私たちは古い友人に頼ることができますData::Dumper
:
CREATE OR REPLACE FUNCTION perl_dump(VARIADIC text[])
RETURNS text AS
$BODY$
use strict;
use warnings;
use Data::Dumper;
my $array_str=shift;
return Dumper($array_str);
$BODY$
LANGUAGE plperl VOLATILE;
そしてこれは戻ります:
> select perl_dump(ARRAY['abc','def']);
perl_dump
----------------------
$VAR1 = '{abc,def}';
(1 row)
したがって、出力は、末尾に中括弧があり、エントリがコンマで区切られている実際の文字列と見なされます。さて、まあ...これは迷惑ですが、少なくとも私たちはそれに対処することができます:
CREATE OR REPLACE FUNCTION final_perl_func(VARIADIC text[])
RETURNS text AS
$BODY$
use strict;
use warnings;
my $array_string=shift;
$array_string=substr($array_string,1,length($array_string)-2);
my @array=split(/,/,$array_string);
my $val=join("###",@array);
my $s=`echo $val`;
chomp($s);
return $s;
$BODY$
LANGUAGE plperl VOLATILE;
そして、これは私たちが望むものを私たちにもたらします:
> select final_perl_func(ARRAY['abc','def']);
final_perl_func
-----------------
abc###def
(1 row)
理解できない理由で、正規表現の置換を試みたときにplperl関数が中括弧を返し続けたsubstr
ため、単純な正規表現の置換()の代わりに使用する必要があったことに注意してください。$array_string=~s/{}//g;
私はそれについてのあなたの質問に答える前にplperlをあまり扱っていませんでした、そして私が学んだ主なことはそれが大きな苦痛であるということです...あなたはPerlを使ってPerlDBI
からデータベースを操作することを検討したいかもしれません。