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

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

执行/home/postgres/test.sh &时显示语法错误。 请问如何在PostgreSQL函数/过程中调用bash脚本。

2个回答

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;

我做了一些更改:

  • 我使用my声明变量$filename
  • 我使用system代替execexec会替换当前进程,实际上不会返回调用函数
  • system希望传递一个字符串。因此我在命令周围添加了引号
  • 在流程控制语句中,and通常比&&更好(而且始终比位翻转的&要好)
  • Perl没有truefalse,因此我用1代替了true(在Perl中是真值)。并且我删除了其他return语句中的false - return的默认行为是返回false值

我没有Postgresql安装来测试它。如果仍然无法工作,请告诉我们您遇到的错误。


4
我不是Perl专家,但system行中似乎缺少一个单引号。 - Laurenz Albe
它对我很好地工作。非常感谢您,Dave,为您的帮助。 - user2266543
1
在期望子程序返回标量时使用 return 是不好的做法(因为子程序并不总是返回标量)。在这里使用 return 0 更有意义。 - ikegami
值得注意的是,Perl有两个逻辑与运算符,它们在优先级上有所不同。高优先级形式&&非常适合紧凑地编写逻辑表达式,例如$foo == 27 && $bar >= 5。低优先级形式最好用于流程控制,例如assert_we_are_done() and return 1;or更经常用于此)。 - daotoad

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接