2012-03-13 20 views
8

Oto kodużyciu Array_append daje mi błąd składni podczas tworzenia funkcji PostgreSQL

CREATE OR REPLACE FUNCTION primes (IN integer) RETURNS TEXT AS $$ 
DECLARE 
    counter INTEGER = $1; 
    primes int []; 
    mycount int; 
    BEGIN 
    WHILE counter != 0 LOOP 
     mycount := count(primes); 
     array_append(primes [counter], mycount); 
     counter := counter - 1; 
    END LOOP; 
    RETURN array_to_text(primes[], ','); 
    END; 
$$ 
LANGUAGE 'plpgsql' 

To ja rozwijających początki podstawowej funkcji generującej. Próbuję po prostu uzyskać to, aby zwrócić "liczbę" tablicy. Więc jeśli przekażę "7" do funkcji, powinienem wrócić [0, 1, 2, 3, 4, 5, 6].

Ale gdy próbuję utworzyć tę funkcję uzyskać

SQL Error: ERROR: syntax error at or near "array_append" LINE 1: array_append($1 [ $2 ], $3) 
     ^QUERY: array_append($1 [ $2 ], $3) CONTEXT: SQL statement in PL/PgSQL function "primes" near line 8 

Jestem początkującym z funkcji PostgreSQL. Nie rozumiem, dlaczego nie mogę poprawnie uruchomić tej macierzy.

Znowu wszystko, czego chcę, to po prostu poprawnie uzupełnić tę tablicę "bieżącą" liczbą tablic. (Chodzi o to, aby pomóc mi zrozumieć, że faktycznie wykonuje pętlę poprawnie i poprawnie ją liczy).

Dziękuję za pomoc.

+0

Dlaczego używasz bazy danych do generowania liczb pierwszych?!? –

+0

Zakładam, że robisz to tylko po to, aby nauczyć się PL/SQL - myślę, że SO byłoby bardziej odpowiednim miejscem dla tego pytania. – MikeyB

+0

Tak, właśnie robię to, aby się uczyć. – StanM

Odpowiedz

13

Z fine manual:

Funkcja: array_append(anyarray, anyelement)
Powrót Rodzaj: anyarray
Opis: dołączyć element do końca tablicy

So array_append zwraca a ray i musisz przypisać tę wartość do czegoś. Ponadto, myślę, że chcesz array_to_string na końcu swojej funkcji, a nie array_to_text. I primes jest tablicą, więc chcesz array_append(primes, mycount) zamiast próbować dołączyć do wpisu w primes.

CREATE OR REPLACE FUNCTION primes (IN integer) RETURNS TEXT AS $$ 
DECLARE 
    counter INTEGER = $1; 
    primes int []; 
    mycount int; 
BEGIN 
    WHILE counter != 0 LOOP 
     mycount := count(primes); 
     primes := array_append(primes, mycount); 
     counter := counter - 1; 
    END LOOP; 
    RETURN array_to_string(primes, ','); 
END; 
$$ LANGUAGE 'plpgsql'; 

Nie wiem, co masz zamiar mycount := count(primes); zrobić, być może chciał powiedzieć mycount := array_length(primes, 1); tak, że można uzyskać ciąg kolejnych liczb całkowitych w primes.

+0

Awesome. Dziękuję, że to był mój problem. I tak, szukałem array_length - staram się nauczyć składni programowania SQL. To zupełnie nowy świat. – StanM

+0

@StanQA: Możesz chcieć rzucić okiem na ['generate_series'] (http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SERIES) na tworzenie sekwencji. Trzeba by pomyśleć w kategoriach zestawów/tabel, a nie pętli, ale tak trzeba i tak podejść do SQL. –

Powiązane problemy