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だけで、「シェルスクリプトは何でもできますが、データベースにアクセスできません」と表示されるため、おそらく機能しません。
注: これらのコード セグメントをコピーして貼り付けることができなかったため、タイプミスがある可能性があります。