gpt4 book ai didi

perl - 从 PL/Perl 代码访问数据库

转载 作者:行者123 更新时间:2023-11-29 12:27:52 24 4
gpt4 key购买 nike

有人可以协助纠正这段代码中的错误。

(这只是我的代码的简化版本,但它指出了问题)。

DROP FUNCTION perl_func(VARIADIC params character varying[]);

CREATE OR REPLACE FUNCTION perl_func(VARIADIC params character varying[])
RETURNS character varying AS
$BODY$
$val = spi_query("array_to_string($1,'###');");
$s = `echo $val`;
return $s;
$BODY$
LANGUAGE plperlu VOLATILE
COST 100;

SELECT * from perl_func('a','d');

这会返回一个语法错误:

ERROR:  syntax error at or near "," at line 2.
CONTEXT: PL/Perl function “perl_func”

主要目的:是将输入参数表示为一个字符串,并用它来调用一些命令行程序,该程序返回一个字符串。然后输出这个字符串作为这个函数的返回值。

最佳答案

原始尝试:

变量 $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)

为了确定它是一个字符串,我们可以求助于我们的老 friend 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)

请注意,由于我不明白的原因,我不得不求助于 substr 而不是简单的正则表达式替换 ($array_string=~s/{}//g;),因为当我尝试替换正则表达式时,plperl 函数一直返回大括号。

在回答您有关它的问题之前,我并没有太多地处理 plperl,我了解到的主要事情是它是一个主要的痛苦......您可能需要考虑使用 the Perl DBI 从 Perl 操作数据库。

关于perl - 从 PL/Perl 代码访问数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10213394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com