/ / Problem Greenplum: funkcja nie może wykonać na segmencie, ponieważ uzyskuje dostęp do relacji - postgresql, greenplum

Problem Greenplum: funkcja nie może wykonać na segmencie, ponieważ uzyskuje dostęp do relacji - postgresql, greenplum

Używam bazy danych greenplum. Poniżej znajduje się definicja funkcji, którą użyłem do wykonania.

UTWÓRZ LUB WYMIEŃ FUNKCJĘ testfunc (IN id int, podwójna precyzja wyjściowa)

ZWRACA podwójną precyzję AS

$ BODY $

zaczynać

wybierz liczbę (*) do stawki z ref_test_V

powrót;

koniec;

$ BODY $

LANGUAGE plpgsql LOTNY;

A kiedy zadzwonię do tej funkcji na liście wyboru, wyrzuci mnie poniżej błędu

Pytanie: wybierz 1, testfunc (id) z ref_test

BŁĄD: XX000: funkcja nie może wykonać w segmencie, ponieważ uzyskuje dostęp do relacji "public.ref_test_v" (functions.c: 155) (seg25 slice1 *****. Com 1026 pid = 193132) (cdbdisp.c: 1326)

TIA

Odpowiedzi:

0 dla odpowiedzi № 1

To nie jest obsługiwane w Greenplum. Zastanów się, co by się stało, gdyby było obsługiwane. Otrzyma jeden wiersz z segmentu, a następnie wykona zliczenie (*). Następny wiersz zostanie pobrany i ponownie wykona obliczenie (*).

Czysty sposób SQL to zrobić:

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

Jeśli nie chcesz używać Common Table Expression, możesz to zrobić za pomocą podkwerendy.

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

0 dla odpowiedzi nr 2

Wywołaj funkcję z poniższej tabeli.

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