[英]Is it possible to define global variables in postgresql
我正在使用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');
用戶定義的參數在會話中是本地的,因此應在每個會話開始時定義參數。
您可以使用技巧並將變量聲明為1行CTE,然后CROSS JOIN到其余部分。 見例子:
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;
你可以用它
CREATE OR REPLACE FUNCTION globals.maxCities()
RETURNS integer AS
$$SELECT 100 $$ LANGUAGE sql IMMUTABLE;
..並在代碼中直接使用globals.maxCities()。
Postgresql不支持數據庫級別的全局變量。 為什么不添加它:
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
,但隨后需要為每種類型的反串行化代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.