从postgres函数/过程/触发器执行Bash脚本(Shell脚本)

从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;

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;
$$ LANGUAGE plperlu;
我改变了一些事情:

  • 我使用
    my
    声明变量
    $filename
  • 我使用了
    system
    而不是
    exec
    exec
    替换当前进程-实际上永远不会返回调用函数
  • 系统
    希望传递一个字符串。因此,我在命令周围添加了引号
  • 在流控制语句中,
    通常比
    &
    好(并且总是比
    &
    好得多,后者用于位翻转,而不是流控制)
  • Perl没有
    true
    false
    ,因此我将
    true
    替换为1(这在Perl中是一个真值)。我已经从另一个
    return
    语句中删除了
    false
    return
    的默认行为是返回一个false值

我没有安装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;