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

use*_*543 3 postgresql bash perl centos postgresql-11

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;
Run Code Online (Sandbox Code Playgroud)

exec /home/postgres/test.sh及其显示的语法错误。您能帮忙如何将bash脚本调用到postgres函数/过程中吗

Dav*_*oss 5

据推测,该代码在语法上必须是有效的Perl。因此,您需要清理一些内容。

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;
Run Code Online (Sandbox Code Playgroud)

我改变了几件事:

  • $filename使用声明变量my
  • 我用system代替execexec替换当前进程-有效地从不返回调用函数
  • system期望传递一个字符串。所以我在命令周围加了引号
  • and通常在流控制语句中比&&(并且总是比&用于位翻转而不是流控制)要好。
  • Perl没有trueand false,所以我已经替换true为1(这是Perl中的真实值)。而且我已经false从其他return语句中删除了-的默认行为return是返回假值

我没有Postgresql安装来对此进行测试。如果仍然无法解决问题,请告诉我们您遇到什么错误。

  • 我不是Perl专家,但是`system`行中似乎缺少单引号。 (4认同)