【问题标题】:Postgres session variables not working inside a functionPostgres会话变量在函数内不起作用
【发布时间】:2020-09-22 09:28:53
【问题描述】:

我在 postgres 函数中设置了一个会话变量,但没有设置值。 非常感谢任何帮助。提前致谢。 我正在使用“PostgreSQL 10.6,由 Visual C++ build 1800 编译,64 位”

我的代码如下: 功能:

CREATE FUNCTION set_rp_vals(iv_rp_company varchar, iv_rp_portfolio varchar)
RETURNS integer
LANGUAGE plpgsql
SECURITY DEFINER
AS $function$

DECLARE

l_retval integer;

BEGIN

    l_retval := 1;

    RAISE NOTICE '1.iv_rp_company: >>> %', iv_rp_company;
    RAISE NOTICE '2.iv_rp_portfolio: >>> %', iv_rp_portfolio;

    --set the session variable
    set rp.company   = iv_rp_company;
    set rp.portfolio = iv_rp_portfolio;

    RETURN l_retval;

    EXCEPTION
        WHEN OTHERS THEN
            RETURN 9;
    END;

$function$
;

函数调用:

SELECT set_rp_vals(iv_rp_company := 'COMPAN',iv_rp_portfolio := 'PORTOF');

--检索会话变量:

select 
current_setting('rp.company') as company,
current_setting('rp.portfolio') as portfolio;

The value returned by the above query:

【问题讨论】:

    标签: postgresql function variables session


    【解决方案1】:

    我会为此使用set_config() 函数:

    CREATE OR REPLACE FUNCTION set_rp_vals(iv_rp_company varchar, iv_rp_portfolio varchar)
    RETURNS integer
    LANGUAGE plpgsql
    SECURITY DEFINER
    AS $function$
    
    DECLARE
    
    l_retval integer;
    
    BEGIN
    
        l_retval := 1;
    
        RAISE NOTICE '1.iv_rp_company: >>> %', iv_rp_company;
        RAISE NOTICE '2.iv_rp_portfolio: >>> %', iv_rp_portfolio;
    
        --set the session variable
        perform set_config('rp.company', iv_rp_company, false);
        perform set_config('rp.portfolio', iv_rp_portfolio, false);
    
        RETURN l_retval;
    
        EXCEPTION
            WHEN OTHERS THEN
                RETURN 9;
        END;
    
    $function$
    ;
    CREATE FUNCTION
    
    

    按照你的价值观执行:

    SELECT set_rp_vals(iv_rp_company := 'COMPAN',iv_rp_portfolio := 'PORTOF');            
    
    NOTICE:  1.iv_rp_company: >>> COMPAN
    NOTICE:  2.iv_rp_portfolio: >>> PORTOF
    ┌─────────────┐
    │ set_rp_vals │
    ├─────────────┤
    │           1 │
    └─────────────┘
    (1 row)
    
    select                                                                                
    current_setting('rp.company') as company,
    current_setting('rp.portfolio') as portfolio;
    
    ┌─────────┬───────────┐
    │ company │ portfolio │
    ├─────────┼───────────┤
    │ COMPAN  │ PORTOF    │
    └─────────┴───────────┘
    (1 row)
    
    

    【讨论】:

    • 嗨,迈克,非常感谢。您的代码有效。我已将您的答案标记为正确。再次非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2015-09-30
    • 2013-04-12
    • 2012-08-17
    • 2014-05-16
    相关资源
    最近更新 更多