2017-06-24 122 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不然後工作。