1

我正在使用一个 pl/pgsql 函数,custom_variable_class函数代码是

CREATE OR REPLACE FUNCTION can_connect("pUserId" character varying)
RETURNS boolean AS
$BODY$DECLARE
user_id integer ;
BEGIN

SELECT users.user_serial INTO user_id
FROM public.users
WHERE users.user_id="pUserId"
;

set public.userId  to user_id  ;
 set public.companyId  to "pUserId" ;
RETURN true ;    

EXCEPTION
 WHEN OTHERS THEN
raise notice ' error %',sqlerrm ;
END ;

$BODY$
LANGUAGE plpgsql VOLATILE

现在使用该功能

 select can_connect ('amr' );
 t

没关系,返回值t符合预期。

但是当试图检索会话变量值时

select current_setting('public.userId') ;
the result is 
 user_id

使用函数参数时,哪个变量名与值不同

select current_setting('public.pUserId') ;
the result is 
pUserId 

谢谢你。

4

2 回答 2

4

使用 plpgsql EXECUTE强制解析器插入变量的值:

EXECUTE 'set public.userId  to ' || quote_literal(user_id);
EXECUTE 'set public.companyId to ' || quote_literal( "pUserId");

作为奖励,它也适用于旧版本的 PostgreSQL。

于 2012-05-07T13:01:13.593 回答
1

这种方式只允许SETPostgreSQL的配置参数。

在 PostgreSQL 9.1 上,我有以下输出:

SET user_id TO bbb;
ERROR:  unrecognized configuration parameter "user_id"

由于 PostgreSQL 没有包,所以保持状态的最好方法是使用临时表

于 2012-05-07T11:42:25.677 回答