2010-05-15 9 views
-1

J'ai un problème dans la fonction postgres:Erreur de syntaxe avec Postgres pour la boucle

CREATE OR REPLACE FUNCTION linkedRepoObjects(id bigint) 
     RETURNS int AS $$ 
      DECLARE catNumber int DEFAULT 0; 
      DECLARE cat RECORD; 
     BEGIN 
     WITH RECURSIVE children(categoryid,category_fk) AS (
     SELECT categoryid, category_fk 
     FROM b2m.category_tab 
     WHERE categoryid = 1 
      UNION ALL 
     SELECT c1.categoryid,c1.category_fk 
     FROM b2m.category_tab c1, children 
     WHERE children.categoryid = c1.category_fk 
     ) 


    FOR cat IN SELECT * FROM children LOOP 
     IF EXISTS (SELECT 1 FROM b2m.repoobject_tab WHERE category_fk = cat.categoryid) THEN 
      catNumber = catNumber +1 
     END IF; 
    END LOOP; 

     RETURN catNumber; 

     END; 
    $$ LANGUAGE 'plpgsql'; 

J'ai erreur:

FEHLER: Syntax error near »FOR« 
LINE 1: ...dren WHERE children.categoryid = c1.category_fk) FOR $2 I... 

Répondre

3

L'erreur de syntaxe est parce qu'il attend le WITH ... à suivre par SELECT où il a trouvé FOR.

Je ne l'ai pas utilisé WITH clauses dans les requêtes en plpgsql, mais j'essayer de déplacer FOR cat IN à l'avant WITH, qui fait partie de la requête.

+0

échantillon de bien vouloir ad :( –

1

Essayez ceci:

CREATE OR REPLACE FUNCTION linkedRepoObjects(id bigint) RETURNS int AS 
$$ 
DECLARE catNumber int DEFAULT 0; 
DECLARE cat RECORD; 
BEGIN 

    FOR cat IN  

     WITH RECURSIVE children(categoryid,category_fk) AS (
     SELECT categoryid, category_fk 
     FROM b2m.category_tab 
     WHERE categoryid = 1 
     UNION ALL 
     SELECT c1.categoryid,c1.category_fk 
     FROM b2m.category_tab c1, children 
     WHERE children.categoryid = c1.category_fk 
     ) 
     SELECT * FROM children 

    LOOP 

     IF EXISTS (SELECT 1 FROM b2m.repoobject_tab WHERE category_fk = cat.categoryid) THEN 
      catNumber = catNumber +1 
     END IF; 

    END LOOP; 

    RETURN catNumber; 

END; 
$$ LANGUAGE 'plpgsql'; 

J'ai remarqué votre requête a besoin à peine en boucle, faire ceci:

CREATE OR REPLACE FUNCTION linkedRepoObjects(id bigint) RETURNS int AS 
$$ 
BEGIN 

    RETURN 
    ( 
    SELECT COUNT(*) FROM b2m.repoobject_tab WHERE category_fk IN 
     (
      WITH RECURSIVE children(categoryid,category_fk) AS 
      (
       SELECT categoryid, category_fk 
       FROM b2m.category_tab 
       WHERE categoryid = 1 
       UNION ALL 
       SELECT c1.categoryid,c1.category_fk 
       FROM b2m.category_tab c1, children 
       WHERE children.categoryid = c1.category_fk 
      ) 
      SELECT categoryid FROM children 
     ) 
    ); 
END; 
$$ LANGUAGE 'plpgsql'; 
+0

par laquelle, il peut être transformé en une langue ' sql 'fonction ... – araqnid

+0

en effet, je viens de m'habituer avec plpgsql :-) –