2012-03-13 11 views
8

Ecco il codiceutilizzando Array_append mi dà errore di sintassi durante la creazione di funzioni di 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' 

Questo mi sta sviluppando l'inizio di una funzione generatrice primaria. Sto cercando di ottenere semplicemente il "conteggio" dell'array. Quindi se passo '7' nella funzione dovrei tornare indietro [0, 1, 2, 3, 4, 5, 6].

Ma quando cerco di creare questa funzione ottengo

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 

Sono un novizio con funzioni di Postgres. Non sto capendo perché non riesco a far funzionare correttamente questo array.

Ancora tutto quello che voglio è riempire questo array correttamente con il conteggio "corrente" dell'array. (È più semplicemente per aiutarmi a capire che in effetti sta facendo il ciclo correttamente e lo sta contando correttamente).

Grazie per il vostro aiuto.

+0

Perché stai utilizzando un database per generare Primes?!? –

+0

Suppongo che tu stia facendo solo questo per imparare PL/SQL - Penso che SO sarebbe un posto più appropriato per questa domanda. – MikeyB

+0

Sì, lo sto solo facendo per imparare. – StanM

risposta

13

Dal fine manual:

Funzione: array_append(anyarray, anyelement)
Tipo restituito: anyarray
Descrizione: aggiungere un elemento alla fine di un array

Così array_append restituisce un ar ray e devi assegnare quel valore di ritorno a qualcosa. Inoltre, penso che tu voglia array_to_string alla fine della tua funzione, non array_to_text. E primes è una matrice in modo che si desidera array_append(primes, mycount) anziché tentare di aggiungere una voce in 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'; 

Non so che cosa si intende mycount := count(primes); di fare, forse volevi dire mycount := array_length(primes, 1); in modo che si potranno ottenere una sequenza di numeri interi consecutivi in ​​primes.

+0

Fantastico. Grazie che era il mio problema (s). E sì, stavo cercando array_length - Sto cercando di imparare la sintassi della programmazione SQL. È un mondo completamente nuovo. – StanM

+0

@StanQA: Si potrebbe voler dare un'occhiata a ['generate_series'] (http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SERIES) per produrre sequenze. Dovresti pensare in termini di set/tabelle piuttosto che cicli, ma è così che devi comunque avvicinarti a SQL. –

Problemi correlati