9

Oracle の PL/SQL では、パッケージ定義を使用してセッション ベースのグローバル変数を作成できます。Postgresql の PLpg/SQL では、パッケージがなく、独立したプロシージャと関数しかないため、それは不可能のようです。

g_spool_key をグローバルとして宣言する PL/SQL の構文は次のとおりです...

CREATE OR REPLACE PACKAGE tox IS
        g_spool_key spool.key%TYPE := NULL;
        TYPE t_spool IS REF CURSOR RETURN spool%ROWTYPE;
        PROCEDURE begin_spool;
        PROCEDURE into_spool
            (
            in_txt IN spool.txt%TYPE
            );
        PROCEDURE reset_spool;
        FUNCTION end_spool
            RETURN t_spool;
        FUNCTION timestamp
            RETURN VARCHAR2;
    END tox;

PLpg/SQL でセッション ベースのグローバル変数を実装するにはどうすればよいですか?

4

6 に答える 6

6

別のオプションは、一時テーブルを作成し、それを使用してすべての一時変数を保存することです

CREATE TEMPORARY TABLE tmp_vars( 
    name varchar(64),
    value varchar(64),
    PRIMARY KEY (name)
);

すべてを管理するストアド プロシージャを作成し、テーブルがまだ存在しない場合はテーブルを作成することもできます。1 つは取り出し用、もう 1 つは保管用です。

于 2009-12-02T23:32:50.177 に答える
6

postgresql.conf でいくつかのカスタム変数クラスを定義し、それをストアド プロシージャで接続変数として使用できます。ドキュメントを参照してください。

カスタム変数クラス「imos」の使用例:

imos=> set imos.testvar to 'foobar';
SET
Time: 0.379 ms
imos=> show imos.testvar;
 imos.testvar
--------------
 foobar
(1 row)

Time: 0.333 ms
imos=> set imos.testvar to 'bazbar';
SET
Time: 0.144 ms
imos=> show imos.testvar;
 imos.testvar
--------------
 bazbar
(1 row)

ストアド プロシージャでは、組み込み関数current_setting('imos.testvar')を使用できます。

于 2009-01-06T16:59:07.357 に答える
3

残念ながら、PL / pgSQLにはグローバル変数はありませんが、PostgreSQLに付属する他のPL言語、特にPL / Perl、PL / Python、PL/Tclで見つけることができます。

于 2009-09-05T03:56:36.703 に答える
3

PostgreSQLはグローバル(セッション)変数をサポートしていませんが、いくつかのトリックを使用する必要があります

http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_II#Any_other_session_variables http://www.postgresql.org/docs/8.3/static/plperl-global.html

PavelStehuleに関して

于 2009-01-06T07:03:09.900 に答える
2

PL/pgsqlテーブルからグローバル変数を保存および取得するスクリプトの例:

CREATE TABLE global_vars (name TEXT PRIMARY KEY, value TEXT);

CREATE FUNCTION put_var(key TEXT, data TEXT) RETURNS VOID AS '
  BEGIN
    LOOP
        UPDATE global_vars SET value = data WHERE name = key;
        IF found THEN
            RETURN;
        END IF;
        BEGIN
            INSERT INTO global_vars(name,value) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
  END;
' LANGUAGE plpgsql;

CREATE FUNCTION get_var(key TEXT) RETURNS TEXT AS '
  DECLARE
    result TEXT;
  BEGIN
    SELECT value FROM global_vars where name = key INTO result;
    RETURN result;
  END;
' LANGUAGE plpgsql;


CREATE FUNCTION del_var(key TEXT) RETURNS VOID AS '
  BEGIN
    DELETE FROM global_vars WHERE name = key;
  END;
' LANGUAGE plpgsql;
于 2012-01-11T08:19:20.793 に答える
1

Postgresql フォーラムから...

それで、いくつか質問があります....

  1. plpgsql からグローバル値を宣言できますか?
  2. もしそうなら、名前空間の汚染を回避する方法はありますか? (おそらく、Oracle の plsql パッケージ変数の使用と同等です)

plpgsql にはグローバル変数がありません。

于 2009-01-05T21:44:06.517 に答える