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 № 1To 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;