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

Postgresの関数内でタイムゾーンを設定する方法: 私はパラメータに「タイムゾーン」エラー無効な値を取得しています

でも私はコード実行「を設定TIMEZONE = $ 1」PersonGame.timezonenameを使用してを変更しようとした「timezonenameを」 ;

しかし、これも機能しません。

私は自分の機能の中にタイムゾーンを設定したいと思います。

本当にありがとうございました。

次の2つの異なる方法でそれを行うことができますおかげ

+0

1.なぜPostgres DBタイムゾーンを変更したいのですか?この設定はDB全体に適用されます。 2.構文は 'SET TIME ZONE value'です([ドキュメントを参照](https://www.postgresql.org/docs/9.1/static/sql-set.html#AEN75747))。 –

+0

私には1つの要件がありますが、これはユーザーの賢明さを必要とします。 – deadpool

+1

@KristoMägi: 'set'を使ってタイムゾーンを変更することは、" DB全体 "には適用されません - 現在のセッションだけに適用されます。 –

答えて

2

  1. あなたが完全に構築された文字列(例:USING なし)で、EXECUTEコマンドを使用することができ、および使用あなたの関数で行っていたとおり、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'を設定し、設定するかどうかを決定するlocalまたはglobal

    あなたがでそれを確認することができます。私の推測では、このプラットフォームではということですので、私は、任意のグローバル設定をしようとしなかったhere dbfiddle

    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   | 
    

をあなたはで両方の機能を確認することができますWebユーザーは適切な権限を持っていません。私の最高の推測では、あなたは同じことをしているシステムでグローバルな変更を行うことができるということです。 パベルStehuleからのコメントを1として


1)USING句は、実行計画のパラメータのために利用可能です。 SETには実行計画がありません - そしてUSING節は利用できません。

+2

'USING'句は、実行計画パラメータでのみ使用できます。'SET'は実行計画を持っておらず、' USING'節は利用できません。 –

+0

はい2番目の部分は、 を使用して動作します。PERFORM 'SET TIME ZONE' || TimezoneName; – deadpool

関連する問題