Sql 函数无法在段上执行,因为它访问关系

Sql 函数无法在段上执行,因为它访问关系,sql,greenplum,Sql,Greenplum,在Greenplum postgres中,我有一个定义如下的函数 CREATE OR REPLACE FUNCTION vin_temp_func(j text) RETURNS integer AS $$ Declare varx integer; BEGIN select count(*) into varx from T_perf a left join T_profile b on a.sr_number = b.sr_number where b.product_name like

在Greenplum postgres中,我有一个定义如下的函数

CREATE OR REPLACE FUNCTION vin_temp_func(j text) RETURNS integer AS $$
Declare varx integer;
BEGIN
select count(*) into varx
from T_perf a
left join T_profile b on a.sr_number = b.sr_number  where b.product_name like '%V1%' and
a.submit_date >= (('2013-02-01'::date - CAST(EXTRACT(DOW FROM '2013-02-01'::date) as int)) - 7)+'1 week'::interval and 
a.submit_date <= ('2013-02-01'::date - CAST(EXTRACT(DOW FROM '2013-02-01'::date)+1 as int)) + '1 week'::interval+'23 hours'::interval+'59 minutes'::interval+'59 seconds'::interval
and b.product_name = j;
RETURN varx;
        END;
$$ LANGUAGE plpgsql;
当我尝试执行以下操作时,我得到错误函数无法在段上执行,因为它访问关系

select product_name, vin_temp_func(product_name) 
from prod_week_A limit 100;

谁能帮我解决这个问题吗。谢谢

与Postgress相比,Greenplum中的功能有限。如果函数访问一个关系表,则不能在选择另一个表时调用它

因此,手动调用函数是可以的

选择vin_temp_func'product1'

会有用的。但正如你所看到的

选择产品名称、vin\u温度\u产品名称 从生产周起,限额为100

会给你这个错误


您可能能够将函数重写为视图,这在很多情况下都是可能的,但在这里这可能很困难

我也处于类似的情况

*从产品周中选择产品名称、vin\U temp\U funcproduct\U name*

工作起来很奇怪,我真的不理解这一点。我限制了从中提取行的表的结果。 所以

*选择产品名称,vin\U temp\U FUNCOU product\U name(从产品名称中选择产品名称,从产品周中选择产品名称)A限额10000000 A*

我在limit前面放了一个巨大的数字来返回所有的行。这需要时间,但这是可行的


请尝试一下,并让我知道这是否也适用于您。

我遇到了类似的问题

INSERT INTO tableX SELECT * from function_name(...);
Wes Reing的观点在AFAIK中似乎是准确的-GPDB确实不希望从引用另一个表的语句调用函数。所以我决定在pl/sql中分解这些部分

DO $$
DECLARE 
  myrow myrowtype;
BEGIN
  SELECT * FROM function_name(...) INTO myrow;
  INSERT INTO tableX (...) (SELECT myrow.*);
  RETURN;
END;
$$ LANGUAGE plpgsql;
这将在主控上收集函数的输出,然后在插入期间将其推回段。这比我们最初想要的要差一点,也就是将函数的输出直接推到段上的表中,但是性能下降和增加主控器的负载在我们的例子中似乎不是什么大问题

希望你能把这个想法应用到你的问题上

INSERT INTO tableX SELECT * from function_name(...);
祝你好运