【问题标题】:Greenplum issue : function cannot execute on segment because it accesses relationGreenplum问题:函数无法在段上执行,因为它访问关系
【发布时间】:2016-07-01 12:25:32
【问题描述】:

我正在使用 Greenplum 数据库。下面是我之前执行的函数定义。

CREATE OR REPLACE FUNCTION testfunc(IN id int, OUT rate double precision)
RETURNS double precision AS
$BODY$
begin
select count(*) into rate from ref_test_V
return;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;

当我在选择列表中调用这个函数时,它会抛出错误

查询: select 1,testfunc(id) from ref_test

错误: XX000:函数无法在段上执行,因为它访问关系“public.ref_test_v”(functions.c:155)(seg25 slice1 *****.com 1026 pid=193132) (cdbdisp.c:1326)

【问题讨论】:

    标签: stored-functions greenplum


    【解决方案1】:

    Greenplum 不支持此功能。想想如果它被支持它会做什么。它会从一个段中获取一行,然后从它本身做一个 count(*)。将检索下一行并再次执行计数(*)。

    执行此操作的纯 SQL 方法是:

    with x as (select count(*) as total_count from ref_test_V)
    select 1, x.total_count from ref_test, x;
    

    如果您不喜欢使用公用表表达式,可以使用子查询来实现。

    select 1, x.total_count 
    from   ref_test, 
           (select count(*) as total_count 
           from ref_test_V) as x;
    

    【讨论】:

    • 我明白这一点,但我想问的是我想根据函数的参数获取具有过滤器值的某个表的计数,并且该函数是从其他表中调用的选择列表。如果我的语法错误,您能否指出正确的语法。示例代码将对我有所帮助。请注意,我不想实现为 SQL。 TIA :)
    • 我已经按照您说的进行了尝试,但问题仍然存在。您能否提供任何可以帮助我的示例代码。我尝试了一切从函数中读取表的记录计数,当我从另一个表的选择列表中调用此函数时,继续收到相同的问题。 TIA
    • :) 我想管理我的功能比我在此博客中解释的更重要,并且问题是由于我之前所说的而引起的,这就是我让它变得简单的原因。由于其复杂性,我无法将该功能实现为 SQL 或 CTE。希望您能帮我找到解决此问题的方法。
    • 从选择列表调用时,是否无法从函数中读取表数据。上述函数在使用常量值作为参数单独调用时有效,但在选择列表中调用时无效。希望有没有其他方法可以克服这个或内联 SQL 是唯一的方法
    • 是的,我同意,我也尝试了两个不同的表,但问题仍然存在。是的,子查询或 CTE 会更有效,但函数的复杂性让我不得不进行函数转换。因此,如果您能向我展示上述函数的正确语法,以便我可以在我的函数中实现它,将会很有帮助。
    【解决方案2】:

    调用下表中的函数。

    select 1, (select testfunc(5)) from ref_test;
    

    【讨论】:

    • 如果您将常量值作为参数传递它会起作用,当您从 ref_test 传递列时它不起作用,这就是我的意思。
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2017-12-18
    • 2015-10-13
    • 2016-02-11
    相关资源
    最近更新 更多