Postgresql 9.4を使用していて、関数を記述しているときに、自己定義のerror_codes(int)を使用したいと思います。ただし後で正確な数値を変更したい場合があります。
例えば
-1はUSER_NOT_FOUNDを意味します。
-2はUSER_DOES_NOT_HAVE_PERMISSIONを意味します。
これらをテーブルcodes_table(code_name :: text、code_value :: integer)で定義し、次のように関数で使用できます。
(SELECT codes_table.code_value FROM codes_table WHERE codes_table.code_name = 'USER_NOT_FOUND')
これには別の方法がありますか。多分グローバル変数?
@ klinの回答 に基づいて、現在のセッションを超えて構成パラメーターを永続化する方法がいくつかあります。これらにはスーパーユーザー特権が必要であることに注意してください。
特定のデータベースへのすべての接続に値を設定するには:
ALTER DATABASE db SET abc.xyz = 1;
9.4で追加された ALTER SYSTEM
コマンドを使用して、サーバー全体の値を設定することもできます。現在のセッションですでにSET
になっている場合にのみ、ユーザー定義パラメーターに対して機能するようです。これを有効にするには、構成のリロードが必要であることにも注意してください。
SET abc.xyz = 1;
ALTER SYSTEM SET abc.xyz = 1;
SELECT pg_reload_conf();
9.4より前では、サーバーのpostgresql.conf
ファイルにパラメーターを追加することで同じことを実行できます。 9.1以前では、 カスタム変数クラス も登録する必要があります。
Postgresにはグローバル変数がありません。ただし、カスタム構成パラメーターを定義できます。わかりやすくするために、glb
などのプレフィックスを付けて独自のパラメータを定義します。
この単純な関数により、クエリにパラメータを簡単に配置できます。
create or replace function glb(code text)
returns integer language sql as $$
select current_setting('glb.' || code)::integer;
$$;
set glb.user_not_found to -1;
set glb.user_does_not_have_permission to -2;
select glb('user_not_found'), glb('user_does_not_have_permission');
ユーザー定義パラメーターはセッション内でローカルであるため、パラメーターは各セッションの開始時に定義する必要があります。
あなたはこれを使うことができます
CREATE OR REPLACE FUNCTION globals.maxCities()
RETURNS integer AS
$$SELECT 100 $$ LANGUAGE sql IMMUTABLE;
..そしてコードでglobals.maxCities()を直接使用します。
トリックを使用して、変数を1行のCTEとして宣言し、それを残りの部分にクロス結合することができます。例を参照してください。
WITH
variables AS (
SELECT 'value1'::TEXT AS var1, 10::INT AS var2
)
SELECT t.*, v.*
FROM
my_table AS t
CROSS JOIN variables AS v
WHERE t.random_int_column = var2;
Postgresqlは、DBレベルのグローバル変数をサポートしていません。追加してみませんか:
CREATE TABLE global_variables (
key text not null PRIMARY KEY
value text
);
INSERT INTO global_variables (key, value) VALUES ('error_code_for_spaceship_engine', '404');
異なるタイプが値である可能性がある場合は、JSONをvalue
のタイプと見なしますが、タイプごとに逆シリアル化コードが必要です。