2016-03-19 21 views
0

Ich habe Probleme mit der Syntax von Postgresql, hauptsächlich mit Rückkehr, während Schleife und Cursor. Wenn ich nichts zurückgeben will, was soll ich schreiben? Was sollte meine while-Schleife sein, um den Cursor zu durchlaufen?Syntaxfehler für Funktion in Postgresql

CREATE FUNCTION price(category integer, reduce real, minimum integer) 
RETURNS void; 

DECLARE name VARCHAR(MAX); 
DECLARE total integer; 
DECLARE number integer; 
BEGIN 

DECLARE C1 CURSOR FOR 
    SELECT people, quantity FROM store WHERE categories = category; 

OPEN C1; 

FETCH C1 INTO name, number; 

total = SELECT SUM(quantity) FROM store WHERE categories = category; 

WHILE (condition) LOOP 
    IF(total > minimum) 
     THEN UPDATE store SET (price = price - reduce) WHERE categories = category; 
    END IF; 
    FETCH C1 INTO name, number; 
END LOOP; 

CLOSE C1; 
END; 
LANGUAGE plpgsql; 
+0

1) Nur 'Rückkehr;' ohne Parameter; 2) Verwenden Sie 'FOUND' Variable: [Beispiel] (http://www.postgresqltutorial.com/plpgsql-cursor/#crayon-56ea6d043addd111161561) – Abelisto

Antwort

0

Ihre Funktion ist übermäßig komplex und es gibt ein paar Syntaxfehler in der Anfangs- und Endzeile.

CREATE FUNCTION price(category integer, reduce real, minimum integer) RETURNS void AS $$ 
DECLARE 
    total integer; 
BEGIN 
    SELECT SUM(quantity) INTO total FROM store WHERE categories = category; 
    IF total > minimum THEN 
    UPDATE store SET price = price - reduce WHERE categories = category; 
    END IF; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql STRICT VOLATILE; 

Sie wirklich nicht wollen, einen Cursor hier eine einzige UPDATE Aussage ist viel effizienter nutzen.

+0

Ich kenne seinen Komplex, aber ich muss einen Cursor und die While-Schleife verwenden – user1836292

+0

Nicht mit das Beispiel, das du zeigst. Ist das vielleicht eine Kursarbeit, in der du dich befindest? – Patrick