2017-07-16 16 views
2
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; 
$$; 

我收到錯誤無效值的參數「時區」:「TIMEZONENAME」如何設置時區Postgres的函數內部

即使我試圖改變代碼執行「設置TIMEZONE = $ 1」使用PersonGame.timezonename ;

但這也行不通。

我想在我的函數中設置時區。

任何幫助真的很感激。

感謝

+0

1.爲什麼要更改Postgres DB時區?此設置適用於整個數據庫。 2.語法爲'SET TIME ZONE value'([參見文檔](https://www.postgresql.org/docs/9.1/static/sql-set.html#AEN75747))。 –

+0

我有一個要求,這需要用戶明智。我已經嘗試過,但沒有工作。 – deadpool

+1

@KristoMägi:通過'set'更改時區並不適用於「整個數據庫」 - 僅適用於當前會話。 –

回答

2

您可以用兩種不同的方式做到這一點:

  1. 可以使用EXECUTE命令,具有完全的構造的字符串(即:無USING ),並使用正如您在函數中所做的那樣,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  | 
    
  2. 可以使用set_config()功能以類似的方式,通過被稱爲PERFORM,將'timezone'設置爲要配置的參數,並確定是否進行設置localglobal

    你可以檢查一下:

    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') ; 
    
     
    | test_set_time_zone_2 | 
    | :------------------- | 
    | US/Central   | 
    

您可以在dbfiddle here我沒有嘗試任何全局設置,檢查這兩個功能,因爲我的猜測是,在這個平臺上網絡用戶將沒有適當的權限;我最好的猜測是你可以在系統中做同樣的事情。


1)由於每從的Pavel Stehule評論:USING子句僅可用於執行計劃的參數。 SET還沒有執行計劃 - 然後USING子句不可用。

+2

'USING'子句僅適用於執行計劃參數。'SET'沒有執行計劃 - 然後'USING'子句不可用。 –

+0

是第二部分使用 PERFORM'SET TIME ZONE'|| TimezoneName; – deadpool