PostgreSQL 存储过程可以调用外部程序吗?

Can a PostgreSQL stored procedure call an external program?

我正在查看有关编写存储过程的 PostgreSQL“Server Programming”文档。我想让存储过程调用现有的外部 shell 脚本来执行任务,然后 return 结果。

我没有在文档中找到这个。支持吗?

是的,它可以,但不是每个 SP 都能做到。 PL/pgSQL 等受信任语言的存储过程无法做到这一点。 Please refer to this 选择不受信任的语言。

"untrusted" 像 PL/perlu 或 PL/Pythonu 这样的 PL 可以,C 用户定义函数也可以。

虽然这通常不是一个好主意。如果调用外部程序然后回滚事务,外部程序将不知道回滚。您正在突破事务管理。

通常最好使用 NOTIFY 将工作发送到已连接的守护程序并 LISTEN 处理事件。

这是我在 Ubuntu 上的做法。请注意,安装 PostgreSQL 时默认情况下不会安装 plperl。

> sudo apt-get install postgresql-plperl
> sudo --user=postgres psql my_database

# CREATE EXTENSION IF NOT EXISTS plperlu;
# CREATE OR REPLACE FUNCTION foo() RETURNS TEXT AS $$
    return `/bin/echo -n "hello world!"`;
    $$ LANGUAGE plperlu;

# select foo();
     foo
-------------
 hello world!
(1 row)