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

SETこの方法では、PostgreSQLの構成パラメーターのみが許可されます。

PostgreSQL 9.1では、次の出力があります。

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

PostgreSQLにはパッケージがないため、状態を維持する最善の方法は一時テーブルを使用することです。

于 2012-05-07T11:42:25.677 に答える