postgresql中的嵌套循环问题
我想知道是否有与变量和postgresql中的嵌套循环有关的工作与其他语言不同。postgresql中的嵌套循环问题
实施例:
CREATE OR REPLACE FUNCTION public.generate_syllables()
RETURNS integer AS
$BODY$
DECLARE
w RECORD;
s RECORD;
current_syllable integer := 1;
vowel_trigger integer := 0;
syllable_count integer := 1;
BEGIN
FOR w IN SELECT id FROM words LOOP
FOR s IN SELECT sound, id FROM sounds WHERE id = w.id ORDER BY ordering LOOP
IF (SELECT sr.vowel FROM sound_reference sr WHERE sr.sound = s.sound) = 1 AND vowel_trigger = 1 THEN
syllable_count := syllable_count + 1;
UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
vowel_trigger := 0;
ELSIF (SELECT sr.vowel FROM sound_reference sr WHERE sr.sound = s.sound) = 1 THEN
vowel_trigger := 1;
UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
ELSE
UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
END IF;
END LOOP;
UPDATE words SET syllables = syllable_count WHERE id = w.id;
syllable_count := 1;
vowel_trigger := 0;
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
当我作为运行该函数,该函数不会进入在if语句的首要条件。我通过在第一个条件中添加return语句来测试它。起初我认为这肯定是一个逻辑错误,但我已经用我的数据集生成的例子手工完成了它,它应该按照需要工作。更奇怪的是,当我在外部循环中注释掉行时,对于vowel_trigger:= 0,那么它会输入第一个if语句。当然,逻辑也不能正常工作,并且从中我已经知道syllable_count在嵌套循环完成循环之前被设置为0,这也解释了为什么第一个条件从不输入,因为设置了vowel_trigger在循环返回到第一个条件之前回到0。
换句话说,在我看来,我的嵌套循环不像嵌套循环,而是嵌套循环在嵌套循环重新启动之前扩展到外部循环。我想我必须不知道如何正确地创建嵌套循环,或者他们只是不能在POSTGRESQL中以这种方式工作...任何建议将不胜感激。
您还没有提供表格结构和更重要的数据。虽然您的功能的行为确实取决于表words
,sounds
和sound_reference
中的数据。例如,如果sound_reference
为空,vowel_trigger
将永远不会是1
,因此第一个IF
变得不可实现。
这将有助于调试功能:
RAISE NOTICE 'printlining helps to debug! vowel_trigger=%, syllable_count=%',
vowel_trigger, syllable_count;
作为一个方面说明,我已经注意到,UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
重复所有的if/else的情况下,所以它可能是值得将其移到他们之外,放在内部END LOOP;
之前。
增加:
...当我注释掉外环线路,为
vowel_trigger
:= 0,则它进入第一个if语句。
它告诉我们,内环的处决一个与vowel_trigger
为1结束,这将允许第一IF
触发,但右边的内循环外,你把它0,所以第一个IF
不然后工作。