2017-06-24 643 views
0

我想知道是否有与变量和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中以这种方式工作...任何建议将不胜感激。

回答

0

您还没有提供表格结构和更重要的数据。虽然您的功能的行为确实取决于表words,soundssound_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不然后工作。