37.7. Á¦¾î ±¸Á¶

Á¦¾î ±¸Á¶´Â ¾Æ¸¶ PL/pgSQLÀÇ °¡Àå À¯¿ë(ÇÑÆí Áß¿ä)ÇÑ ºÎºÐÀÔ´Ï´Ù. PL/pgSQLÀÇ Á¦¾î ±¸Á¶¸¦ »ç¿ëÇØ, PostgreSQLÀÇ µ¥ÀÌÅ͸¦ ¸Å¿ì À¯¿¬, °­·ÂÇÏ°Ô Á¶ÀÛÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù

37.7.1. ÇÔ¼ö·ÎºÎÅÍÀÇ ¹Ýȯ

ÇÔ¼ö·ÎºÎÅÍ µ¥ÀÌÅ͸¦ µ¹·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·ÉÀÌ 2°³ ÀÖ½À´Ï´Ù. RETURN¹× RETURN NEXTÀÔ´Ï´Ù.

37.7.1.1. RETURN

RETURN 
expression
;

RETURN¿Í Ç¥Çö½ÄÀº ÇÔ¼ö¸¦ Á¾·áÇØ, Ç¥Çö½Ä ÀÇ °ªÀ» È£ÃâÇØ µ¹·ÁÁÝ´Ï´Ù. ÀÌ Çü½ÄÀº ÁýÇÕÀ» µ¹·ÁÁÖÁö ¾Ê´Â PL/pgSQLÇÔ¼ö·Î »ç¿ëµË´Ï´Ù.

½ºÄ®¶óÇüÀ» µ¹·ÁÁÖ´Â °æ¿ì´Â ÀÓÀÇÀÇ ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ½ÄÀÇ °á°ú´Â, ´ëÀÔ¿¡¼­ ¼³¸íÇÑ °Íó·³, ÀÚµ¿ÀûÀ¸·Î ÇÔ¼öÀÇ ¹Ýȯ°ªÀÇ ÇüÅ¿¡ ij½ºÆ® µË´Ï´Ù. º¹ÇÕ(Çà)°ªÀ» µ¹·ÁÁÖ±â À§Çؼ­, expression ·Î¼­ ·¹ÄÚµå ȤÀº Çà º¯¼ö¸¦ ±â¼úÇØ¾ß ÇÕ´Ï´Ù.

Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö¸¦ ¼±¾ðÇßÀ» ¶§´Â, ½ÄÀÌ ¾ø´Â RETURN¸¦ ±â¼úÇØ ÁÖ¼¼¿ä. ±× ½ÃÁ¡¿¡ À־ÀÇ Ãâ·Â ¸Å°³º¯¼öÀÇ °ªÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.

void¸¦ µ¹·ÁÁÖµµ·Ï ÇÔ¼ö¸¦ ¼±¾ðÇßÀ» °æ¿ì¿¡¼­µµ, ÇÔ¼ö¸¦ Áï½Ã ºüÁ® ³ª°¡±â À§Çؼ­ RETURN¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, RETURNÀÇ µÚ¿¡ ½ÄÀ» ±â¼úÇÏÁö ¸»¾Æ ÁÖ¼¼¿ä.

ÇÔ¼öÀÇ ¹Ýȯ°ªÀº Á¤ÀǵÇÁö ¾ÊÀº ä·Î ÀÖÀ» ¼ö ¾ø½À´Ï´Ù. Á¦¾î°¡ RETURN¹®ÀÌ ¹ß°ßµÇÁö ¾Ê´Â »óÅ·ΠÇÔ¼öÀÇ ÃÖ»óÁ¤µµÀÇ ºí·ÏÀÇ ¸¶Áö¸·±îÁö ´ÞÇßÀ» ¶§, ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯³ª, ÀÌ Á¦ÇÑÀº Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö ¹× void¸¦ µ¹·ÁÁÖ´Â ÇÔ¼ö¿¡´Â Àû¿ëÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â Ãֻ󷹺§ÀÇ ºí·ÏÀÌ ³¡³µÀ» ¶§, RETURN¹®ÀÌ ÀÚµ¿ÀûÀ¸·Î ½ÇÇàµË´Ï´Ù.

37.7.1.2. RETURN NEXT

RETURN NEXT 
expression
;

PL/pgSQLÇÔ¼ö°¡ SETOF sometype ¸¦ µ¹·ÁÁÖµµ·Ï ¼±¾ðÇßÀ» °æ¿ì, ÈļÓÀÇ Ã³¸®°¡ ´Ù¼Ò ´Ù¸¨´Ï´Ù. ÀÌ °æ¿ì, ¹Ýȯ°ªÀÇ °³°³ÀÇ Ç׸ñÀº, RETURN NEXT¸í·É ¶Ç´Â RETURN QUERY¸í·ÉÀ¸·Î ÁöÁ¤µË´Ï´Ù. ±×¸®°í, ÀÎÀÚ°¡ ¾ø´Â ¸¶Áö¸· RETURN¸í·É¿¡ ÀÇÇØ, ÇÔ¼ö°¡ ½ÇÇàÀ» Á¾·áÇß´ø °ÍÀÌ ³ªÅ¸³³´Ï´Ù. RETURN NEXT´Â, ½ºÄ®¶óÇü ¹× º¹ÇÕÇüÀÇ ¸ðµÎ¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. º¹ÇÕÇüÀÇ °æ¿ì, °á°úÀÇ "Å×À̺í"Àüü°¡ µ¹·ÁÁÖ¾îÁý´Ï´Ù.

½ÇÁ¦·Î´Â, RETURN NEXT´Â ÇÔ¼ö·ÎºÎÅÍ µ¹¾Æ¿ÀÁö ¾Ê½À´Ï´Ù. ´ÜÁö ÇÔ¼öÀÇ °á°ú ÁýÇÕ¿¡ ÇàÀ» Ãß°¡Çϰí ÀÖÀ» »ÓÀÔ´Ï´Ù. ±×¸®°í, ±× ½ÇÇàÀº PL/pgSQLÇÔ¼ö³»ÀÇ ´ÙÀ½ÀÇ ¸í·É¹®¿¡ °è¼ÓÇÕ´Ï´Ù. RETURN NEXT ¶Ç´Â RETURN QUERY¸í·ÉÀÌ ¿¬¼ÓÇØ ½ÇÇàµÇ¸é, °á°ú ÁýÇÕÀÌ ÀÛ¼ºµË´Ï´Ù. ¸¶Áö¸·, ÀÎÀÚ¸¦ °¡Á®¼­´Â ¾È µÇ´Â RETURN¿¡ ÀÇÇØ, ÇÔ¼öÀÇ Á¾·á¸¦ Á¦¾îÇÕ´Ï´Ù. (¶Ç´Â Á¦¾î¸¦ ÇÔ¼öÀÇ ¸¶Áö¸·¿¡ ¿Å±æ ¼ö ÀÖ½À´Ï´Ù).

Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö¸¦ ¼±¾ðÇßÀ» ¶§´Â, ½ÄÀÌ ¾ø´Â RETURN NEXT¸¸À» ±â¼úÇØ ÁÖ¼¼¿ä. ±× ½ÃÁ¡¿¡ À־ÀÇ Ãâ·Â ¸Å°³º¯¼öÀÇ °ªÀÌ, ÇÔ¼ö·ÎºÎÅÍÀÇ ¹Ýȯ°ªÀ» À§Çؼ­ °á°úÀÇ ÇàÀ¸·Î¼­ º¸Á¸µË´Ï´Ù. Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÁýÇÕÀ» µ¹·ÁÁÖ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇϱâ À§Çؼ­´Â, Ãâ·Â ¸Å°³º¯¼ö°¡ º¹¼öÀ϶§´Â SETOF record¸¦ µ¹·ÁÁÖµµ·Ï ÇÔ¼ö¸¦ ¼±¾ðÇØ, sometype ÇüÀÇ Ãâ·Â ¸Å°³º¯¼öÀ϶§´Â SETOF sometype ¸¦ µ¹·ÁÁÖµµ·Ï ÇÔ¼ö¸¦ ¼±¾ðÇØ¾ß ÇÏ´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.

RETURN NEXTÀ» »ç¿ëÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½ÀÇ ¾ç½Ä¿¡ µû¶ó ºÒ·Á°¡¾ß ÇÕ´Ï´Ù.

SELECT * FROM some_func();

Áï, ÇÔ¼ö´Â FROM±¸¿¡¼­ Å×ÀÌºí ¼Ò½º·Î¼­ »ç¿ëµÇ¾î¾ßÇÕ´Ï´Ù.

Note: »ó±â¿Í °°ÀÌ, RETURN NEXT ¹× RETURN QUERYÀÇ ÇöÀçÀÇ ±¸Çö¿¡¼­´Â, ÇÔ¼ö·ÎºÎÅÍ µ¹·ÁÁÖ¾îÁö±â Àü¿¡ °á°ú ÁýÇÕ Àüü¸¦ º¸°üÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, PL/pgSQLÇÔ¼ö°¡ ¸Å¿ì ´ë·®ÀÇ °á°ú ÁýÇÕÀ» µ¹·ÁÁÖ¾úÀ» °æ¿ì, ¼º´ÉÀÌ ÀúÇÏÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ¸Þ¸ð¸®ÀÇ ¼Ò¸ð¸¦ ÇÇÇϱâ À§Çؼ­, µ¥ÀÌÅÍ´Â µð½ºÅ©¿¡ ±âÀÔÇØÁý´Ï´Ù. ±×·¯³ª, ÇÔ¼ö ÀÚü´Â °á°ú ÁýÇÕ Àüü°¡ »ý¼ºµÉ ¶§±îÁö´Â µ¹¾Æ°¡Áö ¾Ê½À´Ï´Ù. Ç×ÈÄ, PL/pgSQLÀÇ ¹öÀü¿¡¼­´Â, ÀÌ Á¦ÇÑÀ» ¹ÞÁö ¾Ê°í ÁýÇÕÀ» µ¹·ÁÁÖ´Â ÇÔ¼ö¸¦ »ç¿ëÀÚ°¡ Á¤ÀÇÇÒ ¼ö ÀÖ°Ô µÉÁöµµ ¸ð¸¨´Ï´Ù. ÇöÀç, µð½ºÅ©¿¡ ±âÀÔÇØÁö´Â µ¥ÀÌÅÍÀÇ °³½ÃÁ¡Àº work_mem¼³Á¤ º¯¼ö¿¡ ÀÇÇØ Á¦¾îµÇ°í ÀÖ½À´Ï´Ù. ´ë·®ÀÇ °á°ú ÁýÇÕÀ» º¸°üÇϴµ¥ ÃæºÐÇÑ ¸Þ¸ð¸®°¡ ÀÖ´Â °æ¿ì, °ü¸®ÀÚ´Â ÀÌ ¸Å°³º¯¼öÀÇ °ªÀ» Å©°Ô ÇÏ´Â °ÍÀ» °í·ÁÇØ¾ß ÇÕ´Ï´Ù.

37.7.2. Á¶°Ç ºÐ±â

IF¸í·É¹®ÀÇ Á¶°Ç¿¡ ±Ù°ÅÇØ ¸í·ÉÀ» ½ÇÇà½Ãŵ´Ï´Ù. PL/pgSQL¿¡´Â, ÀÌÇÏ¿Í °°Àº 5°³ÀÇ IFÀÇ Çü½ÄÀÌ ÀÖ½À´Ï´Ù. IF:

37.7.2.1. IF-THEN

IF 
boolean-expression
 THEN
    
statements

END IF;

IF-THEN¹®Àº, °¡Àå ´Ü¼øÇÑ IFÀÇ Çü½ÄÀÔ´Ï´Ù. THEN¿Í END IFÀÇ »çÀÌÀÇ ¸í·É¹®ÀÇ Á¶°ÇÀÌ ÂüÀÎ °æ¿ì¿¡ ½ÇÇàµË´Ï´Ù. ¾Æ¿¹ ¾øÀ¸¸é ±×°ÍµéÀº ³¯¾Æ°©´Ï´Ù.

Example:

IF v_user_id <> 0 THEN
    UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

37.7.2.2. IF-THEN-ELSE

IF 
boolean-expression
 THEN
    
statements

ELSE
    
statements

END IF;

IF-THEN-ELSE¹®Àº IF-THEN¿¡ Ãß°¡ÇØ Á¶°Ç Æò°¡°¡ °ÅÁþÀÇ °æ¿ì¿¡ ½ÇÇàÇØ¾ß ÇÒ Äõ¸® ÁýÇÕÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

·Ê£º

IF parentid IS NULL OR parentid = ''
THEN
    RETURN fullname;
ELSE
    RETURN hp_true_filename(parentid) || '/' || fullname;
END IF;

IF v_count > 0 THEN 
    INSERT INTO users_count (count) VALUES (v_count);
    RETURN 't';
ELSE
    RETURN 'f';
END IF;

37.7.2.3. IF-THEN-ELSE IF

ÀÌÇÏÀÇ ¿¹¿Í °°ÀÌ, IF¹®Àº »óÀÚ·Î ÇÒ ¼ö ÀÖ½À´Ï´Ù.

IF demo_row.sex = 'm' THEN
    pretty_sex := 'man';
ELSE
    IF demo_row.sex = 'f' THEN
        pretty_sex := 'woman';
    END IF;
END IF;

ÀÌ Çü½ÄÀ» »ç¿ëÇÏ´Â °æ¿ì, ½ÇÁ¦·Î IF¸í·É¹®À» ¿ÜÃøÀÇ IF¸í·É¹®ÀÇ ELSE ºÎºÐÀÇ ¾ÈÂÊ¿¡ »óÀÚ·Î Çϰí ÀÖ½À´Ï´Ù. µû¶ó¼­, »óÀÚ·Î ÇÑ IF¸¶´Ù 1°³ÀÇ END IF¸í·É¹®ÀÌ, ±× ºÎ¸ð°¡ µÇ´Â IF-ELSE¿¡ 1°³ÀÇ END IF¸í·É¹®ÀÌ ÇÊ¿äÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, °Ë»çÇØ¾ß ÇÒ È帰¡ ¸¹ÀÌ ÀÖ´Â °æ¿ì´Â ÀåȲÇÏ°Ô µË´Ï´Ù. ±× °á°ú, ´ÙÀ½ÀÇ Çü½ÄÀÔ´Ï´Ù.

37.7.2.4. IF-THEN-ELSIF-ELSE

IF 
boolean-expression
 THEN
    
statements

[ ELSIF 
boolean-expression
 THEN
    
statements

[ ELSIF 
boolean-expression
 THEN
    
statements

    ...]]
[ ELSE
    
statements
 ]
END IF;

IF-THEN-ELSIF-ELSE´Â, ¾î´À ¹®Àå¿¡ ¸¹Àº ´ëü ¼ö´ÜÀÌ ÀÖ´Â °æ¿ìÀÇ Ã¼Å©¿¡, º¸´Ù Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. ±â´ÉÀûÀ¸·Î´Â, IF-THEN-ELSE-IF-THEN¸í·ÉÀ» »óÀÚ·Î ÇÑ °Í °Í°ú °°½À´Ï´Ù¸¸, ÇÊ¿äÇÑ END IF´Â 1°³ »ÓÀÔ´Ï´Ù.

ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

IF number = 0 THEN
    result := 'zero';
ELSIF number > 0 THEN 
    result := 'positive';
ELSIF number < 0 THEN
    result := 'negative';
ELSE
    -- ³²´Â À¯ÀÏÇÑ °¡´É¼ºÀº ±× °ªÀÌ NULLÀÎ °ÍÀÌ´Ù
    result := 'NULL';
END IF;

37.7.2.5. IF-THEN-ELSEIF-ELSE

ELSEIF´ÂELSIFÀÇ º°¸íÀÔ´Ï´Ù.

37.7.3. ´Ü¼øÇÑ ·çÇÁ

LOOP, EXIT, CONTINUE, WHILE, FOR¹®À» »ç¿ëÇØ, PL/pgSQLÇÔ¼ö·Î, ÀÏ·ÃÀÇ ¸í·É±ºÀ» ¹Ýº¹ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

37.7.3.1. LOOP

[ <<
label
>> ]
LOOP
    
statements

END LOOP [ 
label
 ];

LOOP´Â, EXIT¹® ¶Ç´Â RETURN¹®¿¡ ÀÇÇØ Á¾·áµÉ ¶§±îÁö ¹«ÇÑÇÏ°Ô ¹Ýº¹µÇ´Â, Á¶°Ç ¾ø´Â ·çÇÁ¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿É¼ÇÀÇ label ´Â, »óÀÚÀå ·çÇÁ³»ÀÇ EXIT¹×CONTINUE¹®À¸·Î, ¾î´À ·¹º§ÀÇ »óÀÚ¿¡ Àû¿ëÇÏ´ÂÁö¸¦ ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù.

37.7.3.2. EXIT

EXIT [ 
label
 ] [ WHEN 
expression
 ];

label °¡ ÁöÁ¤µÇÁö ¾Ê´Â °æ¿ì, °¡Àå ¾ÈÂÊÀÇ ·çÇÁ¸¦ ³¡³» END LOOPÀÇ ´ÙÀ½ÀÇ ¸í·É¹®ÀÌ ±× ÈÄ¿¡ ½ÇÇàµË´Ï´Ù. label °¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì, ±×°ÍÀº ÇöÀçÀÇ ·çÇÁ, ȤÀº »óÀÚ°¡ µÈ ·çÇÁ³ª ºí·ÏÀÇ ¿ÜÃøÀÇ ·¹º§ÀÇ ¶óº§ÀÏ Çʿ䰡 ÀÖ½À´Ï´Ù. ±× ÈÄ, Áö¸íµÈ ·çÇÁ ¶Ç´Â ºí·ÏÀ» ³¡³»°í ±× ·çÇÁ ¶Ç´Â ºí·ÏÀÇ ´ëÀÀÇÏ´Â ENDÀÇ ´ÙÀ½ÀÇ ¸í·É¹®¿¡ Á¦¾î¸¦ ¿Å±é´Ï´Ù.

WHEN°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì, boolean-expression °¡ ÁøÁ¤ÇÑ °æ¿ì¸¸ ·çÇÁÀÇ Á¾·á°¡ ÀϾ´Ï´Ù. ¾Æ¿¹ ¾øÀ¸¸é, EXITÀÇ µÚÀÇ Çà¿¡ Á¦¾î°¡ ¿Å±é´Ï´Ù.

EXIT´Â, ¸ðµç ·çÇÁ¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ¾î Á¶°Ç ¾ø´Â ·çÇÁ·Î ÇÑÁ¤µÇÁö ¾Ê½À´Ï´Ù. BEGINºí·Ï°ú ÇÔ²² »ç¿ëÇßÀ» ¶§, EXIT¿¡ ÀÇÇØ ºí·ÏÀÇ ´ÙÀ½ÀÇ ¸í·É¹®¿¡ Á¦¾î°¡ ³Ñ¾î°©´Ï´Ù.

¿¹£º

LOOP
    -- ¿¬»ê
    IF count > 0 THEN
        EXIT;  -- exit loop
    END IF;
END LOOP;

LOOP
    -- ¿¬»ê
    EXIT WHEN count > 0;  -- ÀüÀÇ ¿¹¿Í °°Àº °á°ú
END LOOP;

BEGIN
    -- ¿¬»ê
    IF stocks > 100000 THEN
        EXIT;  -- À̰Ϳ¡ ÀÇÇØ BEGIN ºí·ÏÀ» ºüÁ® ³ª°£´Ù
    END IF;
END;

37.7.3.3. CONTINUE

CONTINUE [ 
label
 ] [ WHEN 
expression
 ];

label °¡ ¾ø´Â °æ¿ì, ¹Ù·Î ¿ÜÃøÀÇ ·çÇÁÀÇ ´ÙÀ½ÀÇ ¹Ýº¹ÀÌ °³½ÃµË´Ï´Ù. Áï, ·çÁ¦¾î´Â ·çÇÁ Á¦¾î ½ÄÀÇ µÚ¸¦ Áö³ª°¡°í, ·çÇÁÀÇ º»¹®Àº ÀçÆò°¡µË´Ï´Ù. label °¡ Á¸ÀçÇÏ´Â °æ¿ì, ½ÇÇàÀ» °è¼ÓÇÏ´Â ·çÇÁÀÇ ¶óº§À» ÁöÁ¤ÇÕ´Ï´Ù.

WHEN°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì, boolean-expression °¡ ÂüÀÎ °æ¿ì¸¸ ·çÇÁ¿¡ À־ÀÇ ´ÙÀ½ÀÇ ¹Ýº¹ÀÌ ½ÃÀ۵˴ϴÙ. ¾Æ¿¹ ¾øÀ¸¸é, CONTINUEÀÇ µÚÀÇ Çà¿¡ Á¦¾î°¡ ³Ñ¾î°©´Ï´Ù.

CONTINUE´Â ¸ðµç Á¾·ùÀÇ ·çÇÁ·Î »ç¿ë °¡´ÉÇÕ´Ï´Ù. Á¶°Ç ¾ø´Â ·çÇÁ·Î ÇÑÁ¤µÇÁö ¾Ê½À´Ï´Ù.

¿¹:

LOOP
    -- ¿¬»ê
    EXIT WHEN count > 100;
    CONTINUE WHEN count < 50;
    -- 50¿¡¼­ 100À» ¼¼´Â, ¿¬»ê
END LOOP;

37.7.3.4. WHILE

[ <<
label
>> ]
WHILE 
expression
 LOOP
    
statements

END LOOP [ 
label
 ];

WHILE¹®Àº boolean-expression ÀÇ Æò°¡°¡ ÂüÀÎ µ¿¾È, ¸í·É¹®ÀÇ ÁÙÀ» ¹Ýº¹ÇÕ´Ï´Ù. Á¶°Ç½ÄÀº, ·çÇÁ º»¹®¿¡ µé¾î°¡±â Àü¿¡¸¸ üũµË´Ï´Ù.

ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- ¿©±â¼­ ¿¬»êÀ» ½Ç½ÃÇÕ´Ï´Ù.
END LOOP;

WHILE NOT boolean_expression LOOP
    -- ¿©±â¼­ ¿¬»êÀ» ½Ç½ÃÇÕ´Ï´Ù.
END LOOP;

37.7.3.5. FOR(Á¤¼ö º¯¼ö)

[ <<
label
>> ]
FOR 
name
 IN [ REVERSE ] 
expression
 .. 
expression
 [ BY 
expression
 ] LOOP
    
statements

END LOOP [ 
label
 ];

ÀÌ Çü½ÄÀÇ FOR´Â Á¤¼ö°ªÀÇ ¹üÀ§¸¦ ¹Ýº¹ÇÏ´Â ·çÇÁ¸¦ »ý¼ºÇÕ´Ï´Ù. name º¯¼ö´Â integerÇüÀ¸·Î¼­ ÀÚµ¿ÀûÀ¸·Î Á¤ÀÇµÇ¾î ·çÇÁ ³»ºÎ¸¸À¸·Î Á¸ÀçÇÕ´Ï´Ù (·çÇÁ ¿ÜºÎ¿¡¼­ Á¤ÀÇÇØµµ, ·çÇÁ ³»ºÎ¿¡¼­´Â ¸ðµÎ ¹«½ÃµË´Ï´Ù). ¹üÀ§ÀÇ ÇÏÇÑ, »óÇÑÀ¸·Î¼­ ÁÖ¾îÁö´Â 2°³ÀÇ ½ÄÀº ·çÇÁ¿¡ µé¾î°¬À» ¶§¿¡ ÇÑ ¹ø¸¸ Æò°¡µË´Ï´Ù. BY±¸¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ» ¶§ÀÇ »óÈ£ÀÛ¿ë ´Ü°è´Â 1ÀÔ´Ï´Ù¸¸, BY±¸¸¦ ÀÌ¿ëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ¾î ·çÇÁ¿¡ µé¾î°¬À» ¶§¿¡ ÇÑ ¹ø¸¸ Æò°¡µË´Ï´Ù. REVERSE°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì, »óÈ£ÀÛ¿ë ´Ü°èÀÇ °ªÀº ºÎ·Î °£Áֵ˴ϴÙ.

Á¤¼ö FOR ·çÇÁÀÇ ¿¹¸¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

FOR i IN 1..10 LOOP
¿¬»ê
    RAISE NOTICE 'i is %', i;
END LOOP;

FOR i IN REVERSE 10..1 LOOP
¿¬»ê
END LOOP;

FOR i IN REVERSE 10..1 BY 2 LOOP
¿¬»ê
    RAISE NOTICE 'i is %', i;
END LOOP;

ÇÏÇÑÀÌ »óÇѺ¸´Ù Å«(REVERSEÀÇ °æ¿ì´Â º¸´Ù ÀÛ´Ù) °æ¿ì, ·çÇÁ º»¹®¿¡´Â ÀüÇô ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. ¿¡·¯´Â ¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù.

37.7.4. Äõ¸® °á°ú¿¡ ÀÇÇÑ ¹Ýº¹

´Ù¸¥ Á¾·ùÀÇ FOR·çÇÁ¸¦ »ç¿ëÇØ, Äõ¸®ÀÇ °á°ú¸¦ ¹Ýº¹ÇØ, ±× µ¥ÀÌÅ͸¦ Ãë±ÞÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ±¸¹®À» ³ªÅ¸³À´Ï´Ù.

[ <<
label
>> ]
FOR 
target
 IN 
query
 LOOP
    
statements

END LOOP [ 
label
 ];

target ´Â, ·¹ÄÚµå º¯¼ö, Çà º¯¼ö ¶Ç´Â Äĸ¶·Î ´Ü¶ôÁöÀº ½ºÄ®¶ó º¯¼öÀÇ ¸®½ºÆ®ÀÔ´Ï´Ù. target ¿¡´Â Â÷·ÊÂ÷·Ê, query ÀÇ °á°úÀÇ ¸ðµç ÇàÀÌ ´ëÀÔµÇ¾î °¢ Çà¿¡ ´ëÇØ¼­ ·çÇÁ º»¹®ÀÌ ½ÇÇàµË´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

CREATE FUNCTION cs_refresh_mviews() RETURNS integer AS $$
DECLARE
    mviews RECORD;
BEGIN
    PERFORM cs_log('Refreshing materialized views...');

    FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP

        -- ¿©±â¼­ "mviews"´Â cs_materialized_viewsÀÇ ÇϳªÀÇ ·¹Äڵ带 °¡Áý´Ï´Ù

        PERFORM cs_log('Refreshing materialized view ' || quote_ident(mviews.mv_name) || ' ...');
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(mviews.mv_name);
        EXECUTE 'INSERT INTO ' || quote_ident(mviews.mv_name) || ' ' || mviews.mv_query;
    END LOOP;

    PERFORM cs_log('Done refreshing materialized views.');
    RETURN 1;
END;
$$ LANGUAGE plpgsql;

ÀÌ ·çÇÁ°¡ EXIT¹®À¸·Î Á¾·áÇßÀ» °æ¿ì, ¸¶Áö¸·¿¡ ÇÒ´çÇÒ ¼ö ÀÖ¾ú´ø ÇàÀÇ °ªÀº ·çÇÁ¸¦ ºüÁø ´ÙÀ½¿¡µµ Á¢±Ù ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

ÀÌ ÇüÅÂÀÇ FORÄõ¸® query ·Î¼­ ÇàÀ» µ¹·ÁÁÖ´Â ¸ðµç SQL ¸í·ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Åë»óÀº SELECTÀÔ´Ï´Ù¸¸, RETURNING±¸¸¦ ¼ö¹ÝÇÑ INSERT, UPDATE ¶Ç´Â DELETEµµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. EXPLAINµîÀÇ À¯Æ¿¸®Æ¼ ¸í·Éµµ ÀÛµ¿ÇÕ´Ï´Ù.

FOR-IN-EXECUTE¸í·É¹®Àº ÇàÀ» ¹Ýº¹ÇÏ´Â 1°³ÀÇ ¹æ¹ýÀÔ´Ï´Ù.

[ <<
label
>> ]
FOR 
target
 IN EXECUTE 
text_expression
 LOOP 
    
statements

END LOOP [ 
label
 ];

ÀÌ ¹æ¹ýÀº, Äõ¸®ÀÇ ¼Ò½º°¡ ¹®ÀÚ¿­½Ä¿¡¼­ ÁöÁ¤µÇ´Â Á¡À» Á¦¿ÜÇØ, ÀüÀÇ Çü½Ä°ú ´à¾Æ ÀÖ½À´Ï´Ù. ÀÌ ½ÄÀº FOR·çÇÁÀÇ °¢ ¿£Æ®¸®·Î Æò°¡µÇ¾î Àç°èȹÀ» ÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, ÇÁ·Î±×·¡¸Ó´Â, Åë»óÀÇ EXECUTE¹®°ú °°ÀÌ »çÀü¿¡ °èȹµÈ Äõ¸®¿¡ ÀÇÇÑ °í¼Ó¼º°ú µ¿ÀûÀÎ Äõ¸®°¡ °¡Áö´Â À¯¿¬¼ºÀ» ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.

Note: PL/pgSQLÆÄ¼­´Â IN¿Í LOOP »çÀÌ¿¡ °ýÈ£ ¹Û¿¡ ..°¡ ³ªÅ¸³ª´ÂÁö ¾Æ´ÑÁö¸¦ üũÇÏ´Â °ÍÀ¸·Î ÇöÀç µÎ Á¾·ùÀÇ FOR·çÇÁ(Á¤¼ö ȤÀº Äõ¸®°á°ú)·Î ±¸º°µË´Ï´Ù.

37.7.5. ¿¡·¯ÀÇ Æ÷Âø

±âº»°ªÀ¸·Î, PL/pgSQLÇÔ¼öÀÇ ³»ºÎ¿¡¼­ ¹ß»ýÇÑ ¿¡·¯´Â ÇÔ¼öÀÇ ½ÇÇàÀ» ÁßÁöÇØ, ½ÇÁ¦·Î ÁÖº¯ÀÇ Æ®·£Àè¼ÇÀ» Áß´Ü(abort) ÇÕ´Ï´Ù. BEGINºí·Ï ¹× EXCEPTION±¸¸¦ »ç¿ëÇϸé, ¿¡·¯¸¦ Æ÷ÂøÇØ ±× »óÅ·κÎÅÍ È¸º¹ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±× ±¸¹®Àº Åë»óÀÇ BEGINºí·ÏÀÇ ±¸¹®À» È®ÀåÇÑ °ÍÀÔ´Ï´Ù.

[ <<
label
>> ]
[ DECLARE
    
declarations
 ]
BEGIN
    
statements

EXCEPTION
    WHEN 
condition
 [ OR 
condition
 ... ] THEN
        
handler_statements

    [ WHEN 
condition
 [ OR 
condition
 ... ] THEN
          
handler_statements

      ... ]
END;

¿¡·¯°¡ ¹ß»ýÇÏÁö ¾ÊÀ» ¶§, ÀÌ Çü½ÄÀÇ ºí·ÏÀº ´ÜÁö ¸ðµç statements ¸¦ ½ÇÇàÇØ, ENDÀÇ ´ÙÀ½ÀÇ ¹®Àå¿¡ Á¦¾î°¡ ¿Å±é´Ï´Ù. ±×·¯³ª, ¸í·É¹® ÀÇ ³»ºÎ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇϸé, ±× ÀÌÈÄÀÇ ¸í·É¹® ÀÇ Ã³¸®´Â ÁߴܵǾî EXCEPTION¿¡ ³ªÅ¸³½ À϶÷¿¡ Á¦¾î°¡ ¿Å±é´Ï´Ù. ±×¸®°í À϶÷Áß¿¡¼­, ¹ß»ýÇÑ ¿¡·¯¿Í ÇÕÄ¡Çϴ ù¹øÂ° Á¶°Ç ¸¦ ã½À´Ï´Ù. ÇÕÄ¡ÇÏ´Â °ÍÀÌ ÀÖÀ¸¸é, ´ëÀÀÇÏ´Â Çڵ鷯 ¸í·É¹® À» ½ÇÇàÇØ, ENDÀÇ ´ÙÀ½ÀÇ ¹®Àå¿¡ Á¦¾î°¡ ¿Å±é´Ï´Ù. ÇÕÄ¡ÇÏ´Â °ÍÀÌ ¾øÀ¸¸é, EXCEPTION±¸°¡ Á¸ÀçÇÏÁö ¾Ê´Â °Í°ú °°¾Æ, ¿¡·¯´Â ¿ÜÃø¿¡ ÆÄ±ÞÇÕ´Ï´Ù. EXCEPTION¸¦ Æ÷ÇÔÇÑ ¿ÜÃøÀÇ ºí·ÏÀº ¿¡·¯¸¦ Æ÷ÂøÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, ½ÇÆÐÇϸé ÇÔ¼öÀÇ Ã³¸®´Â Áߴܵ˴ϴÙ.

¸ðµç »óÅ ¸íÀº Appendix A¿¡ ³ªÅ¸³¾ ¼ö°¡ ÀÖ½À´Ï´Ù. ºÐ·ù¸íÀº °Å±â·Î ºÐ·ùµÇ´Â ¸ðµç ¿¡·¯¿¡ ÇÕÄ¡ÇÕ´Ï´Ù. OTHERS¶ó´Â Ưº°ÇÑ »óŸíÀº QUERY_CANCELEDÀÌ¿ÜÀÇ ¸ðµç ¿¡·¯¿¡ ÇÕÄ¡ÇÕ´Ï´Ù (QUERY_CANCELED¸¦ À̸§À¸·Î Æ÷ÂøÇÏ´Â °ÍÀº °¡´ÉÇÕ´Ï´Ù¸¸, Çö¸íÇÏÁö´Â ¾Ê½À´Ï´Ù). »óŸíÀº, ´ë¹®ÀÚ¿Í ¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾Ê½À´Ï´Ù.

¿¡·¯°¡ ÇØ´çÇÏ´Â Çڵ鷯 ¸í·É¹® ³»ºÎ¿¡¼­ »õ·Ó°Ô ¹ß»ýÇßÀ» ¶§, EXCEPTION±¸´Â ±× ¿¡·¯¸¦ Æ÷ÂøÇÏÁö ¸øÇÏÁö¸¸, ¿¡·¯´Â ¿ÜÃø¿¡ ÆÄ±ÞµË´Ï´Ù. ¿ÜÃøÀÇ EXCEPTION±¸´Â, ±× ¿¡·¯¸¦ Æ÷ÂøÇÒ ¼ö ÀÖ½À´Ï´Ù.

EXCEPTION±¸°¡ ¿¡·¯¸¦ Æ÷ÂøÇßÀ» ¶§, PL/pgSQLÇÔ¼öÀÇ ·ÎÄà º¯¼ö´Â ¿¡·¯°¡ ÀϾ ÈÄ »óŸ¦ À¯ÁöÇÕ´Ï´Ù. ±×·¯³ª, ºí·Ï ³»ºÎÀÇ ¿µ¼ÓÀûÀÎ µ¥ÀÌÅͺ£À̽º »óÅ´Â, ·Ñ¹é(rollback) µË´Ï´Ù. ±×·¯ÇÑ ¿¹¸¦ ÀÌÇÏ¿¡ ³ªÅ¸³À´Ï´Ù.

    INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');
    BEGIN
        UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
        x := x + 1;
        y := x / 0;
    EXCEPTION
        WHEN division_by_zero THEN
            RAISE NOTICE 'caught division_by_zero';
            RETURN x;
    END;

Á¦¾î°¡ º¯¼ö yÀÇ ´ëÀÔÀ¸·Î ¿Å±â¸é, Á¦·Î·Î ³ª´©±â ¶§¹®¿¡ division_by_zero¿¡·¯°¡ µÇ¾î, EXCEPTION±¸°¡ ±× ¿¡·¯¸¦ Æ÷ÂøÇÕ´Ï´Ù. RETURN¹®¿¡ ÀÇÇÑ ÇÔ¼öÀÇ ¹Ýȯ°ªÀº, 1À» °¡»êÇÑ ÈÄÀÇ xÀÇ °ªÀÌ µË´Ï´Ù¸¸, UPDATE¸í·É¿¡ ÀÇÇÑ °á°ú´Â ·Ñ¹é(rollback) µË´Ï´Ù. ±×·¯³ª, ÀÌÀü ºí·ÏÀÇ INSERT¸í·ÉÀº ·Ñ¹é(rollback) µÇÁö ¾Ê½À´Ï´Ù. µû¶ó¼­, µ¥ÀÌÅͺ£À̽ºÀÇ ³»¿ëÀÇ ÃÖÁ¾ °á°ú´Â Tom JonesÀ̸ç, Joe Jones°¡ ¾Æ´Õ´Ï´Ù.

Tip: EXCEPTION±¸¸¦ Æ÷ÇÔÇÑ ºí·ÏÀÇ ½ÇÇà¿¡ ÇÊ¿ä·Î ÇÏ´Â ½Ã°£Àº, Æ÷ÇÔÇÏÁö ¾Ê´Â ºí·Ï¿¡ ºñÇØ ¸Å¿ì ±æ¾îÁý´Ï´Ù. µû¶ó¼­, Çʿ䰡 ¾øÀ» ¶§¿¡ EXCEPTION¸¦ »ç¿ë ÇØ¼­´Â ¾ÈµË´Ï´Ù.

¿¹¿Ü Çڵ鷯ÀÇ ³»ºÎ¿¡¼­´Â, SQLSTATEº¯¼ö°¡ ÀϾ ¿¹¿Ü¿¡ ´ëÀÀÇÑ ¿¡·¯ Äڵ带 º¸À¯ÇÕ´Ï´Ù. (Table A-1ÀÇ ¿¡·¯ ÄÚµåÇ¥¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä). SQLERRMº¯¼ö´Â ¿¹¿Ü¿¡ ´ëÀÀÇÑ ¿¡·¯ ¸Þ¼¼Áö¸¦ º¸À¯ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ º¯¼ö´Â, ¿¹¿Ü Çڵ鷯ÀÇ ¿ÜºÎ¿¡¼­´Â Á¤ÀǵÇÁö ¾Ê½À´Ï´Ù.

Example 37-1. UPDATE/INSERTÀÇ ¿¹¿Ü

À̰ÍÀº UPDATE ¶Ç´Â INSERTÀÇ ½ÇÇà¿¡ À־ÀÇ ¿¹¿Ü 󸮸¦ »ç¿ëÇÑ Àû´çÇÑ ¿¹Á¦ÀÔ´Ï´Ù.

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
    LOOP
        UPDATE db SET b = data WHERE a = key;
        IF found THEN
            RETURN;
        END IF;

        BEGIN
            INSERT INTO db(a,b) VALUES (key, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;

SELECT merge_db(1, 'david');
SELECT merge_db(1, 'dennis');