Postgresql Postgres FOR循环的语法错误

Postgresql Postgres FOR循环的语法错误,postgresql,stored-procedures,for-loop,plpgsql,Postgresql,Stored Procedures,For Loop,Plpgsql,我在postgres函数中遇到问题: 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

我在postgres函数中遇到问题:

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';
我有个错误:

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

语法错误是因为它希望带…的
后面跟着找到它的位置


在plpgsql的查询中,我没有使用
WITH
子句,但我会尝试将
FOR cat in
移动到
WITH
之前,这是查询的一部分。

语法错误是因为它希望
WITH…
后面紧跟着找到它的位置

我没有在plpgsql的查询中使用带
子句的
,但我会尝试将cat in的
移动到带
之前,这是查询的一部分。

尝试以下操作:

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';
我注意到您的查询几乎不需要循环,只需执行以下操作:

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';
试试这个:

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';
我注意到您的查询几乎不需要循环,只需执行以下操作:

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';

事实上,我刚刚习惯了plpgsql:-)事实上,我刚刚习惯了plpgsql:-)