是否可以在postgresql中定义全局变量

时间:2015-07-09 11:25:49

标签: postgresql global-variables postgresql-9.4

我正在使用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')

还有另一种方法吗?也许全局变量?

5 个答案:

答案 0 :(得分:4)

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 :(得分:4)

@klin's answer的基础上,有几种方法可以将配置参数保留在当前会话之外。请注意,这些都需要超级用户权限。

为特定数据库的所有连接设置值:

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及更早版本中,您还需要注册custom variable class

答案 2 :(得分:1)

您可以使用此

CREATE OR REPLACE FUNCTION globals.maxCities()
  RETURNS integer AS
  $$SELECT 100 $$ LANGUAGE sql IMMUTABLE;

..并直接在代码中使用globals.maxCities()。

答案 3 :(得分:0)

您可以使用技巧并将变量声明为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;

答案 4 :(得分:0)

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的类型,但是每种类型都需要反序列化代码。