2016-12-20 4 views
0

Ich versuche FunktionFehler erzeugen bei Funktion

CREATE OR REPLACE FUNCTION public.my_sql_function3(IN inputval integer) 
    RETURNS TABLE("ID" integer, name character varying, cnt integer) AS 
$BODY$ 
    select t.id, t.name, CAST(count(*) AS INTEGER) 
    from test t 
    where t.id < inputval 
    group by t.id, t.name $BODY$ 
    LANGUAGE plpgsql VOLATILE; 

zu erstellen und erhalten Fehler:

ERROR: syntax error at or near "select"

LINE 4: select t.id, t.name, CAST(count(*) AS INTEGER)

Wie es zu beheben?

+0

Neben verwenden: Wenn 'id' der Primärschlüssel ist, können Sie auf 'Gruppe von t.id' zu vereinfachen. Siehe: http://stackoverflow.com/questions/8684486/pgerror-error-aggregates-not-allowed-in-where-clause-on-a-ar-query-of-an-objec/8684512#8684512 –

Antwort

0

Sie haben die Funktion als eine PL/pgSQL-Funktion definiert, aber Ihre Syntax ist für eine einfache SQL-Funktion.

Sie benötigen

LANGUAGE sql 
+0

Die hinzugefügt Bemerkung ist falsch. Die Umwandlung in "Integer" ist notwendig. 'count (*)' gibt 'bigint' zurück, was einen Fehler auslösen würde. –

+0

@ErwinBrandstetter: würde das nicht "automatisch" passieren, weil die Returnspalte im 'return table()' Teil als 'integer' definiert ist? –

+0

'CREATE FUNCTION' akzeptiert Datentypen, bei denen mindestens eine' implizite' Umwandlung registriert ist (wie zwischen 'varchar' und' text'). Aber die Umwandlung von 'bigint' nach' int' ist nur 'Zuweisung' (möglicher Überlauf!). Details: http://stackoverflow.com/a/21051215/939860 –

Verwandte Themen