【问题标题】:Correct way in Postgresql 9.2 to call a function in a queryPostgresql 9.2 中在查询中调用函数的正确方法
【发布时间】:2014-03-13 18:08:05
【问题描述】:

我今天注意到我的日志文件有些奇怪。我看到一个“通知”被一遍又一遍地登录。而且我想我已经找到了原因,但不理解它或解决方法。

查询是:

select (get_account_details(account.id)).* from account where id in (113126123254, 116261470380);

get_account_details 将在某些情况下记录一条消息 - 一种情况是帐户具有 daily_spend_limit。在我的日志中我看到:

NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 116261470380 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00
NOTICE:  Account 113126123254 has a daily_spend_limit of 10.00.  Remaining balance as been calculated as 10.00

莫名其妙,但我终于注意到它被调用了 17 次 where account.这是帐户表中的确切列数。

如果我跑:

select * from get_account_details(113126123254);

我只记录了 1 条通知。

这里发生了什么以及我如何“正确”编写此查询?

【问题讨论】:

    标签: postgresql postgresql-9.2


    【解决方案1】:

    我不明白为什么更简单的构造会为每一列调用一次函数,但这是抑制它的一种方法:

    select (get_account_details).* from 
    (
        select get_account_details(account.id) from account 
             where id in (113126123254, 116261470380)
    ) foo
    

    由于您无法重现,而且我手边没有您的架构,所以让我从头开始创建架构:

    create table foo (id integer, a text, b text, c text, d text, e text);
    insert into foo (id) select * from generate_series(1,4);
    create function get_foo(int) returns setof foo as $$ BEGIN 
        RAISE NOTICE 'dfjkl'; 
        return query select * from foo where id=$1; 
    END $$ language plpgsql;
    

    现在执行这些,第一个给出 12 NOTICE,第二个给出 2。

    select (get_foo(id)).* from foo where id in (1,2);
    select (get_foo).* from (select get_foo(id) from foo where id in (1,2)) ssss;
    

    【讨论】:

    • 我刚刚测试了您的解决方案,得到了相同的日志输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多