从 postgres 的存储函数中运行外部 sql 脚本的最佳方法是什么?
这个问题 解释了如何从在 psql 中运行的脚本中调用外部脚本,但是我需要在调用周围包装逻辑,所以它必须在存储的函数中完成。
例如。
/tmp/scripts$ cat create_db.sql
CREATE TABLE dbVersion (
versionNum VARCHAR(10) NOT NULL,
applied TIMESTAMP
PRIMARY KEY (versionNum)
);
/tmp/scripts$ cat upgrade_db.sql
CREATE OR REPLACE FUNCTION UpgradeDB (dbName VARCHAR)
RETURN void AS $$
DECLARE
BEGIN
IF EXISTS (SELECT datname from pg_database WHERE datname = dbName) THEN
--Do upgrade code
ELSE
--Install Fresh
\i /tmp/scripts/create_db.sql;
END IF;
END;
$$ language plpgsql;
SELECT UpgradeDB('foo');
这(不出所料)给出了一个错误
错误:“\”处或附近的语法错误
我可以使用plsh来调用,类似于(未经测试)...
CREATE FUNCTION callSQLScript(scriptPath text)
RETURNS void AS $$
#!/bin/sh
plsql -f scriptPath
$$ LANGUAGE plsh;
SELECT callSQLScript('/tmp/scripts/create_db.sql');
但这似乎很笨拙。
只是 plsh 的 RTFM,它指出“shell 脚本可以做任何你想做的事情,但你不能访问数据库”,所以这可能行不通。
注意,我无法复制/粘贴这些代码段,因此可能存在拼写错误。