CREATE OR REPLACE FUNCTION myfunction(userid BIGINT)
RETURNS REAL
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
DECLARE
------------------------Fetch all Active Games for a user and add it to one cursor--------------------------------------
PersonGames NO SCROLL CURSOR FOR select timezonename from user where id=userid;
BEGIN
OPEN PersonGames;
LOOP
FETCH PersonGames INTO PersonGame;
IF NOT found
THEN
EXIT;
END IF;
SET TIMEZONE=PersonGame.timezonename;
-- execute 'set TIMEZONE=$1' using PersonGame.timezonename;
end loop;
END;
$$;
我收到参数“TimeZone”的错误无效值:“timezonename”
即使我尝试使用PersonGame.timezonename更改代码执行'set TIMEZONE = $ 1';
但这也行不通。
我想在我的函数中设置时区。
任何帮助都非常感激。
谢谢
答案 0 :(得分:2)
您可以通过两种不同的方式完成这项工作:
您可以使用EXECUTE
命令,使用完全构造的字符串(即:没有USING
1 ),并使用SET [LOCAL] TIME ZONE
声明,正如你在函数中所做的那样。
此功能可让您测试它:
CREATE OR REPLACE FUNCTION test_set_time_zone(_new_time_zone TEXT)
RETURNS TEXT
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
BEGIN
EXECUTE 'SET LOCAL TIME ZONE ''' || _new_time_zone || ''';' ;
RETURN current_setting('timezone') ;
END;
$$;
您可以查看:
SELECT test_set_time_zone('Europe/Paris');
| test_set_time_zone | | :----------------- | | Europe/Paris |
您可以以类似方式使用set_config()
功能,通过PERFORM
调用,将'timezone'
设置为要配置的参数,并决定是否进行设置{ {1}}或local
。
您可以查看:
global
| test_set_time_zone_2 | | :------------------- | | US/Central |
你可以在 dbfiddle here 检查这两个功能我没有尝试任何全局设置,因为我的猜测是在这个平台上,网络用户不会拥有适当的特权;我最好的猜测是你可以在你的系统做全局变化做同等的事情。
1) 根据来自 Pavel Stehule的评论:CREATE OR REPLACE FUNCTION test_set_time_zone_2 (_new_time_zone TEXT)
RETURNS TEXT
SECURITY DEFINER
LANGUAGE plpgsql
AS $$
BEGIN
PERFORM set_config('timezone', _new_time_zone, true /* local */) ;
RETURN current_setting('timezone') ;
END;
$$;
SELECT test_set_time_zone_2('US/Central') ;
子句仅适用于执行计划参数。 USING
没有执行计划 - 然后SET
子句不可用。