【问题标题】:Syntax error with Postgres FOR LOOPPostgres FOR LOOP 的语法错误
【发布时间】:2010-05-15 08:33:16
【问题描述】:

我的 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...

【问题讨论】:

    标签: postgresql stored-procedures for-loop plpgsql


    【解决方案1】:

    语法错误是因为它期望WITH ... 后面跟着SELECT,它在哪里找到FOR

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

    【讨论】:

      【解决方案2】:

      试试这个:

      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 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多