| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 37. PL/pgSQL - SQL¼ö¼Ó ¾ð¾î | Fast Forward | Next |
Á¦¾î ±¸Á¶´Â ¾Æ¸¶ PL/pgSQLÀÇ °¡Àå À¯¿ë(ÇÑÆí Áß¿ä)ÇÑ ºÎºÐÀÔ´Ï´Ù. PL/pgSQLÀÇ Á¦¾î ±¸Á¶¸¦ »ç¿ëÇØ, PostgreSQLÀÇ µ¥ÀÌÅ͸¦ ¸Å¿ì À¯¿¬, °·ÂÇÏ°Ô Á¶ÀÛÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù
ÇÔ¼ö·ÎºÎÅÍ µ¥ÀÌÅ͸¦ µ¹·ÁÁÖ±â À§Çؼ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·ÉÀÌ 2°³ ÀÖ½À´Ï´Ù. RETURN¹× RETURN NEXTÀÔ´Ï´Ù.
RETURN expression ;
RETURN¿Í Ç¥Çö½ÄÀº ÇÔ¼ö¸¦ Á¾·áÇØ, Ç¥Çö½Ä ÀÇ °ªÀ» È£ÃâÇØ µ¹·ÁÁÝ´Ï´Ù. ÀÌ Çü½ÄÀº ÁýÇÕÀ» µ¹·ÁÁÖÁö ¾Ê´Â PL/pgSQLÇÔ¼ö·Î »ç¿ëµË´Ï´Ù.
½ºÄ®¶óÇüÀ» µ¹·ÁÁÖ´Â °æ¿ì´Â ÀÓÀÇÀÇ ½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ½ÄÀÇ °á°ú´Â, ´ëÀÔ¿¡¼ ¼³¸íÇÑ °Íó·³, ÀÚµ¿ÀûÀ¸·Î ÇÔ¼öÀÇ ¹Ýȯ°ªÀÇ ÇüÅ¿¡ ij½ºÆ® µË´Ï´Ù. º¹ÇÕ(Çà)°ªÀ» µ¹·ÁÁÖ±â À§Çؼ, expression ·Î¼ ·¹ÄÚµå ȤÀº Çà º¯¼ö¸¦ ±â¼úÇØ¾ß ÇÕ´Ï´Ù.
Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö¸¦ ¼±¾ðÇßÀ» ¶§´Â, ½ÄÀÌ ¾ø´Â RETURN¸¦ ±â¼úÇØ ÁÖ¼¼¿ä. ±× ½ÃÁ¡¿¡ ÀÖ¾î¼ÀÇ Ãâ·Â ¸Å°³º¯¼öÀÇ °ªÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.
void¸¦ µ¹·ÁÁÖµµ·Ï ÇÔ¼ö¸¦ ¼±¾ðÇßÀ» °æ¿ì¿¡¼µµ, ÇÔ¼ö¸¦ Áï½Ã ºüÁ® ³ª°¡±â À§Çؼ RETURN¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, RETURNÀÇ µÚ¿¡ ½ÄÀ» ±â¼úÇÏÁö ¸»¾Æ ÁÖ¼¼¿ä.
ÇÔ¼öÀÇ ¹Ýȯ°ªÀº Á¤ÀǵÇÁö ¾ÊÀº ä·Î ÀÖÀ» ¼ö ¾ø½À´Ï´Ù. Á¦¾î°¡ RETURN¹®ÀÌ ¹ß°ßµÇÁö ¾Ê´Â »óÅ·ΠÇÔ¼öÀÇ ÃÖ»óÁ¤µµÀÇ ºí·ÏÀÇ ¸¶Áö¸·±îÁö ´ÞÇßÀ» ¶§, ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯³ª, ÀÌ Á¦ÇÑÀº Ãâ·Â ¸Å°³º¯¼ö¸¦ °¡Áø ÇÔ¼ö ¹× void¸¦ µ¹·ÁÁÖ´Â ÇÔ¼ö¿¡´Â Àû¿ëÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â Ãֻ󷹺§ÀÇ ºí·ÏÀÌ ³¡³µÀ» ¶§, RETURN¹®ÀÌ ÀÚµ¿ÀûÀ¸·Î ½ÇÇàµË´Ï´Ù.
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¼³Á¤ º¯¼ö¿¡ ÀÇÇØ Á¦¾îµÇ°í ÀÖ½À´Ï´Ù. ´ë·®ÀÇ °á°ú ÁýÇÕÀ» º¸°üÇϴµ¥ ÃæºÐÇÑ ¸Þ¸ð¸®°¡ ÀÖ´Â °æ¿ì, °ü¸®ÀÚ´Â ÀÌ ¸Å°³º¯¼öÀÇ °ªÀ» Å©°Ô ÇÏ´Â °ÍÀ» °í·ÁÇØ¾ß ÇÕ´Ï´Ù.
IF¸í·É¹®ÀÇ Á¶°Ç¿¡ ±Ù°ÅÇØ ¸í·ÉÀ» ½ÇÇà½Ãŵ´Ï´Ù. PL/pgSQL¿¡´Â, ÀÌÇÏ¿Í °°Àº 5°³ÀÇ IFÀÇ Çü½ÄÀÌ ÀÖ½À´Ï´Ù. IF:
IF ... THEN
IF ... THEN ... ELSE
IF ... THEN ... ELSE IF
IF ... THEN ... ELSIF ... THEN ... ELSE
IF ... THEN ... ELSEIF ... THEN ... ELSE
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;
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;
ÀÌÇÏÀÇ ¿¹¿Í °°ÀÌ, 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¸í·É¹®ÀÌ ÇÊ¿äÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, °Ë»çÇØ¾ß ÇÒ È帰¡ ¸¹ÀÌ ÀÖ´Â °æ¿ì´Â ÀåȲÇÏ°Ô µË´Ï´Ù. ±× °á°ú, ´ÙÀ½ÀÇ Çü½ÄÀÔ´Ï´Ù.
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;
ELSEIF´ÂELSIFÀÇ º°¸íÀÔ´Ï´Ù.
LOOP, EXIT, CONTINUE, WHILE, FOR¹®À» »ç¿ëÇØ, PL/pgSQLÇÔ¼ö·Î, ÀÏ·ÃÀÇ ¸í·É±ºÀ» ¹Ýº¹ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
[ << label >> ] LOOP statements END LOOP [ label ];
LOOP´Â, EXIT¹® ¶Ç´Â RETURN¹®¿¡ ÀÇÇØ Á¾·áµÉ ¶§±îÁö ¹«ÇÑÇÏ°Ô ¹Ýº¹µÇ´Â, Á¶°Ç ¾ø´Â ·çÇÁ¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿É¼ÇÀÇ label ´Â, »óÀÚÀå ·çÇÁ³»ÀÇ EXIT¹×CONTINUE¹®À¸·Î, ¾î´À ·¹º§ÀÇ »óÀÚ¿¡ Àû¿ëÇÏ´ÂÁö¸¦ ÁöÁ¤Çϱâ À§Çؼ »ç¿ëµË´Ï´Ù.
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;
CONTINUE [ label ] [ WHEN expression ];
label °¡ ¾ø´Â °æ¿ì, ¹Ù·Î ¿ÜÃøÀÇ ·çÇÁÀÇ ´ÙÀ½ÀÇ ¹Ýº¹ÀÌ °³½ÃµË´Ï´Ù. Áï, ·çÁ¦¾î´Â ·çÇÁ Á¦¾î ½ÄÀÇ µÚ¸¦ Áö³ª°¡°í, ·çÇÁÀÇ º»¹®Àº ÀçÆò°¡µË´Ï´Ù. label °¡ Á¸ÀçÇÏ´Â °æ¿ì, ½ÇÇàÀ» °è¼ÓÇÏ´Â ·çÇÁÀÇ ¶óº§À» ÁöÁ¤ÇÕ´Ï´Ù.
WHEN°¡ ÁöÁ¤µÇ¾úÀ» °æ¿ì, boolean-expression °¡ ÂüÀÎ °æ¿ì¸¸ ·çÇÁ¿¡ ÀÖ¾î¼ÀÇ ´ÙÀ½ÀÇ ¹Ýº¹ÀÌ ½ÃÀ۵˴ϴÙ. ¾Æ¿¹ ¾øÀ¸¸é, CONTINUEÀÇ µÚÀÇ Çà¿¡ Á¦¾î°¡ ³Ñ¾î°©´Ï´Ù.
CONTINUE´Â ¸ðµç Á¾·ùÀÇ ·çÇÁ·Î »ç¿ë °¡´ÉÇÕ´Ï´Ù. Á¶°Ç ¾ø´Â ·çÇÁ·Î ÇÑÁ¤µÇÁö ¾Ê½À´Ï´Ù.
¿¹:
LOOP
-- ¿¬»ê
EXIT WHEN count > 100;
CONTINUE WHEN count < 50;
-- 50¿¡¼ 100À» ¼¼´Â, ¿¬»ê
END LOOP;
[ << 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;
[ << 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ÀÇ °æ¿ì´Â º¸´Ù ÀÛ´Ù) °æ¿ì, ·çÇÁ º»¹®¿¡´Â ÀüÇô ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. ¿¡·¯´Â ¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù.
´Ù¸¥ Á¾·ùÀÇ 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·çÇÁ(Á¤¼ö ȤÀº Äõ¸®°á°ú)·Î ±¸º°µË´Ï´Ù.
±âº»°ªÀ¸·Î, 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');