2016-07-01 18 views
0

我正在使用greenplum数据库。下面是我用来执行的函数定义。Greenplum问题:函数无法在段上执行,因为它访问关系

CREATE OR REPLACE FUNCTION testfunc(IN ID INT,淘汰率双精度)

退货双精度

$ BODY $

开始

SELECT COUNT(*)成率from ref_test_V

return;

end;

$ BODY $

语言plpgsql VOLATILE;

当我在选择列表中它扔我下面的错误调用这个函数

查询:选择1,testfunc(ID)从ref_test

错误: XX000:功能无法执行上段,因为它访问关系 “public.ref_test_v”(functions.c:155)(SEG25 slice1 ***** COM 1026 PID = 193132。)(cdbdisp.c:1326)

TIA

回答

0

这在Greenplum中不受支持。想想如果它被支持,它会做什么。它会从一个段获得一行,然后从它自己进行计数(*)。下一行将被检索,它会再次计数(*)。

纯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; 
+0

我明白了,但我想问的是我想要获取某个表的计数与基于函数的参数的过滤器值,并从选择列表中的其他表中调用该函数。如果我的语法错误,你可以用正确的语法指出我的意思。示例代码将帮助我。请注意,我不想实现为SQL。 TIA :) – jaga

+0

您必须执行两条不同的SQL语句(一个使用count,另一个使用其他select)或在函数中使用变量来捕获记录数。 –

+0

我按照您的说法尝试过,但问题仍然存在。你能提供任何可以帮助我的示例代码吗?我试图从函数中读取表的记录数,当我从另一个表的选择列表中调用此函数时,仍然会收到同样的问题。 TIA – jaga

0

从下面的表中调用函数。

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

它的工作,如果你传递常量值作为参数,它不工作时,从ref_test传递列,这正是我所暗示的。 – jaga

相关问题