1

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だけで、「シェルスクリプトは何でもできますが、データベースにアクセスできません」と表示されるため、おそらく機能しません。

注: これらのコード セグメントをコピーして貼り付けることができなかったため、タイプミスがある可能性があります。

4

4 に答える 4

1

\i が機能しない理由は、\i が Postgresql コマンドではなく PSQL コマンドであるためです。したがって、関数はサーバーによって評価されるため、関数内で \i を使用することはできません。

あなたのソリューション:

  1. 関数にSqlを書く
  2. SQL をテーブルに記述し、EVAL 関数を使用する
  3. 提案されたplsql(ただし、psqlを使用する必要があります)。
于 2013-02-13T16:37:01.270 に答える
1

psqlつづりが間違っていても、plshスクリプトは機能すると思います。データベースにアクセスしていません。それを行うために別のプログラムを呼び出しています。大きな注意点として、それはスクリプトが別のトランザクションで実行され、別のセッションでさえ実行されることを意味しますが、これはあなたが望むものではないかもしれません.

これを行っていた場合、テーブルを作成します。

CREATE TABLE sql_jobs (
      job_id serial not null unique, -- machine key
      job_name text primary key,
      sql_to_execute text not null
);

次に、変数を選択して実行できます。もちろんセキュリティには気をつけて……。

于 2012-09-11T06:40:55.297 に答える
-1

コマンドを使用できます:

psql -d myDataBase -a -f /tmp/scripts/create_db.sql;

Else ブロック内

于 2012-11-26T08:12:40.980 に答える