2012-03-13 17 views
8

Este es el códigousando Array_append me da error de sintaxis al crear la función de 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' 

Esto me está desarrollando el comienzo de una función de generación de primos. Estoy tratando simplemente de que devuelva el 'conteo' de la matriz. Entonces, si paso '7' a la función, debería volver [0, 1, 2, 3, 4, 5, 6].

Pero cuando intento crear esta función me sale

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 

soy un novato con funciones de Postgres. No entiendo por qué no puedo hacer que esta matriz funcione correctamente.

De nuevo, todo lo que quiero es llenar esta matriz correctamente con el conteo 'actual' de la matriz. (Es más solo para ayudarme a entender que de hecho está haciendo el ciclo correctamente y lo está contando correctamente).

Gracias por su ayuda.

+0

¿Por qué está utilizando una base de datos para generar Primes?!? –

+0

Supongo que solo está haciendo esto para aprender PL/SQL, creo que SO sería un lugar más apropiado para esta pregunta. – MikeyB

+0

Sí, solo estoy haciendo esto para aprender. – StanM

Respuesta

13

Desde el fine manual:

Función: array_append(anyarray, anyelement)
Tipo de retorno: anyarray
Descripción: añadir un elemento al final de una matriz

Así array_append devuelve un ar rayo y necesita asignar ese valor de retorno a algo. Además, creo que quiere array_to_string al final de su función, no array_to_text. Y primes es una matriz por lo que desea array_append(primes, mycount) en lugar de intentar agregar a una entrada en 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'; 

No sé lo que se propone mycount := count(primes); hacer, tal vez quería decir mycount := array_length(primes, 1); por lo que se podrían obtener una secuencia de números enteros consecutivos en primes.

+0

Impresionante. Gracias ese fue mi problema (s). Y sí, estaba buscando array_length. Estoy intentando aprender la sintaxis de programación SQL. Es un mundo completamente nuevo. – StanM

+0

@StanQA: Es posible que desee echarle un vistazo a ['generate_series'] (http://www.postgresql.org/docs/current/static/functions-srf.html#FUNCTIONS-SRF-SERIES) para producir secuencias. Tendría que pensar en términos de conjuntos/tablas en lugar de bucles, pero así es como tiene que acercarse a SQL de todos modos. –

Cuestiones relacionadas