Postgresql plpgsql中的FOR和FOREACH行为异常

Postgresql plpgsql中的FOR和FOREACH行为异常,postgresql,for-loop,plpgsql,Postgresql,For Loop,Plpgsql,好吧,这是给某人的礼物。在返回某个类型集的函数中发生了一些奇怪的行为 我已经将(plpgsql)代码简化为它的基本功能 << myloop >> FOR items IN SELECT ..... LOOP PERFORM pg_notify('debug', 'Step 1'); IF items.fielda IS NULL THEN PERFORM pg_notify('debug', 'Step 1.1'); ELSE PERFOR

好吧,这是给某人的礼物。在返回某个类型集的
函数中发生了一些奇怪的行为

我已经将(plpgsql)代码简化为它的基本功能

<< myloop >>
FOR items IN SELECT ..... LOOP
  PERFORM pg_notify('debug', 'Step 1');

  IF items.fielda IS NULL THEN
    PERFORM pg_notify('debug', 'Step 1.1');

  ELSE
    PERFORM pg_notify('debug', 'Step 1.2');

    IF something_blah THEN
      PERFORM pg_notify('debug', 'Step 1.2.1');
      -- Used an array her in case of yielding complications, etc.,
      -- but either a FOR IN SELECT or FOREACH produce this same error.
      myarray := returning_sometype_array_function();

      << aloop >>
      FOREACH aitem IN myarray LOOP      -- "aitem" is of "sometype" 
        PERFORM pg_notify('debug', 'Step 1.2.1.x');

        IF aitem.fieldx IS NOT NULL THEN
          -- my array item only produces one record with 
          -- a `fieldx` as NOT NULL.
          id_a := aitem.fieldx;

          RETURN NEXT ROW(...)::sometype;
          PERFORM pg_notify('debug', 'Step 1.2.1.x.1');

        ELSE
          PERFORM pg_notify('debug', 'Step 1.2.1.x.2');
        END IF;

        RETURN NEXT aitem;
        PERFORM pg_notify('debug', 'Step 1.2.1.x finished');
      END LOOP aloop;

      PERFORM pg_notify('debug', 'Step 1.2.1 finished');

    ELSE
      PERFORM pg_notify('debug', 'Step 1.2.2');
      RETURN NEXT ROW(...)::sometype
      PERFORM pg_notify('debug', 'Step 1.2.2 finished');
    END IF;

    PERFORM pg_notify('debug', 'Step 1.2 Finished');
  END IF;

  PERFORM pg_notify('debug', 'Step 1 Finished');
END LOOP myloop;
>
对于“选择…”中的项目。。。。。环
执行pg_通知(“调试”,“步骤1”);
如果items.fielda为空,则
执行pg_通知(“调试”,“步骤1.1”);
其他的
执行pg_通知(“调试”,“步骤1.2”);
如果有什么事那么
执行pg_通知(“调试”,“步骤1.2.1”);
--在出现并发症等情况下使用阵列。,
--但SELECT中的FOR或FOREACH都会产生相同的错误。
myarray:=返回_sometype_array_函数();
>
myarray循环中的FOREACH aitem--“aitem”是“sometype”
执行pg_通知(“调试”,“步骤1.2.1.x”);
如果aitem.fieldx不为空,则
--我的数组项只生成一条具有
--“fieldx”不能为空。
id_a:=aitem.fieldx;
返回下一行(…)::sometype;
执行pg_通知(“调试”,“步骤1.2.1.x.1”);
其他的
执行pg_通知(“调试”,“步骤1.2.1.x.2”);
如果结束;
返回下一个aitem;
执行pg_通知(“调试”,“步骤1.2.1.x完成”);
末端环路aloop;
执行pg_通知(“调试”,“步骤1.2.1完成”);
其他的
执行pg_通知(“调试”,“步骤1.2.2”);
返回下一行(…)::sometype
执行pg_通知(“调试”,“步骤1.2.2完成”);
如果结束;
执行pg_通知(“调试”,“步骤1.2完成”);
如果结束;
执行pg_通知(“调试”,“步骤1完成”);
端环myloop;
现在,如果我运行它,进入我的
FOREACH
循环,进入步骤1.2.1.x.1部分,我将得到以下通知顺序

  • 第一步
  • 步骤1.2
  • 步骤1.2.1
  • 返回\u sometype\u array\u function()
    在这里被调用
  • 步骤1.2.1.x
  • 步骤1.2.1.x.1
  • 步骤1.2.1.x完成
  • 再次调用返回的\u sometype\u array\u函数()
  • 步骤1.2.1.x.2
  • 步骤1.2.1已完成
  • 步骤1.2已完成
  • 步骤1已完成
  • 步骤1.2.2
如您所见,我们没有执行的
ELSE
部分(因为它们不满足条件)似乎在it循环的末尾被调用

另外,
返回的\u sometype\u array\u函数()
在调用这些
ELSE
之前也会再次调用,最终会弄乱我的数据并生成2条记录!!此函数仅在代码中的该点出现

我还得到了反映这一点的
结果集,因此我的代码最终将两个结果编译成一个结果,这会混淆我的应用程序

此函数用于根据条件生成特定项,
返回\u sometype\u array\u函数()
在表中生成一个新的特殊项,该项将被复制,因此我的代码随后引用第二条记录,这将抛出链接到它的其他记录。此函数用于在通过导线连接两个以上对象时,了解是否要添加连接点

我似乎找不到任何关于bug的信息,老实说,我不知道该怎么问

有没有人有过bug方面的经验,或者我没有正确地结束工作。
它编译和流动,我甚至在
循环中使用了
,或者可以提供任何建议


干杯

我的
returning\u sometype\u array\u function()
函数中还有一个
pg\u notify
,这就是我知道它再次被调用的原因。你确定没有其他调用同时发生(对于你发布其主体的函数)?不幸的是,多个调用可能会导致您在
侦听
结束时查看这些日志,但只有一个调用。-通知显示在同一个PID上,就像它们显示在我的“异步通知”输出上一样。我已经一遍又一遍地读代码了,因为我想我可能有一些嵌套的代码,但是没有。有一个通知只出现在
返回\u sometype\u array\u function()
调用中,并且该调用(已经对整个项目进行了搜索)仅在该行被调用。起初我认为它是循环的,但是在循环的开始和结束调用了
pg\u notify
,当它再次调用它时,它似乎错过了第一个
pg\u notify
,这告诉我要么是
pg\u notify
第二次调用失败,要么是发生了一些可疑的事情。