【问题标题】:Execute a Bash script (Shell Script) from postgres function/procedure/trigger从 postgres 函数/过程/触发器执行 Bash 脚本(Shell 脚本)
【发布时间】:2019-08-15 20:35:00
【问题描述】:
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;

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

【问题讨论】:

    标签: bash postgresql perl centos postgresql-11


    【解决方案1】:

    pl/sh 存在,可以作为程序语言使用。

    https://github.com/petere/plsh

    【讨论】:

      【解决方案2】:

      大概,代码需要是语法上有效的 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,所以我将true 替换为1(这是Perl 中的真实值)。我已经从另一个 return 语句中删除了 false - return 的默认行为是返回一个错误值

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

      【讨论】:

      • 我不是 Perl 专家,但system 行中似乎缺少单引号。
      • 它对我来说很好用。非常感谢戴夫的帮助。
      • 当 sub 预期返回标量时使用 return 是不好的做法(因为 sub 不会总是返回标量)。 return 0 在这里更有意义。
      • 值得注意的是,Perl 有两个优先级不同的 逻辑和 运算符。高优先级形式&& 非常适合紧凑地编写逻辑表达式,例如$foo == 27 && $bar >= 5。低优先级形式最适合用于流控制,例如 assert_we_are_done() and return 1;or 更频繁地用于此目的)。
      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2014-04-02
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多