在postgres的存儲函數中運行外部SQL腳本的最佳方式是什麼?postgresql從函數內部運行外部SQL腳本
this question 解釋瞭如何從在psql中運行的腳本中調用外部腳本,但是我需要在該調用周圍包裝邏輯,因此它必須在存儲函數內完成。
EG。
/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腳本可以做任何你想做的事情,但你不能訪問數據庫',所以這可能不會工作。
請注意,我無法複製/粘貼這些代碼段,因此可能會出現拼寫錯誤。
其實最新的PL/SH明確支持'psql'呼籲數據庫訪問:https://github.com/petere/plsh#database - 訪問 –