从postgres函数/过程/触发器执行Bash脚本(Shell脚本)
exec/home/postgres/test.sh&显示语法错误。从postgres函数/过程/触发器执行Bash脚本(Shell脚本),bash,postgresql,perl,centos,postgresql-11,Bash,Postgresql,Perl,Centos,Postgresql 11,exec/home/postgres/test.sh&显示语法错误。 您能帮助我们如何将bash脚本调用到postgres函数/过程中吗。所以你需要清理一些碎片 CREATE or replace FUNCTION test() RETURNS boolean AS $$ $filename = '/home/postgres'; if (-e $filename) { exec /home/postgres/test.sh & return true; } return false;
您能帮助我们如何将bash脚本调用到postgres函数/过程中吗。所以你需要清理一些碎片
CREATE or replace FUNCTION test() RETURNS boolean AS $$
$filename = '/home/postgres';
if (-e $filename) {
exec /home/postgres/test.sh &
return true; }
return false;
$$ LANGUAGE plperlu;
我改变了一些事情:
- 我使用
声明变量my
$filename
- 我使用了
而不是system
exec
替换当前进程-实际上永远不会返回调用函数exec
希望传递一个字符串。因此,我在命令周围添加了引号系统
- 在流控制语句中,
通常比和
好(并且总是比&
好得多,后者用于位翻转,而不是流控制)&
- Perl没有
和true
,因此我将false
替换为1(这在Perl中是一个真值)。我已经从另一个true
语句中删除了return
,false
的默认行为是返回一个false值return
我没有安装Postgresql来测试这一点。如果仍然不起作用,请告诉我们您得到了什么错误。pl/sh存在,可以用作过程语言
我不是Perl专家,但是
系统中似乎缺少一个引号。这对我来说很好。非常感谢Dave的帮助。当子系统需要返回标量时,使用return
(因为子系统并不总是返回标量),这是一种不好的做法<代码>返回0
在这里更有意义。值得注意的是,Perl有两个优先级不同的逻辑and运算符。高优先级形式&
非常适合紧凑地编写逻辑表达式,如$foo==27&&$bar>=5
。低优先级形式最好用于流控制,比如assert\u we\u are\u done()并返回1
(或
更频繁地用于此)。
CREATE or replace FUNCTION test() RETURNS boolean AS $$
my $filename = '/home/postgres';
if (-e $filename) {
system '/home/postgres/test.sh' and return 1;
}
return;
$$ LANGUAGE plperlu;