| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 37. PL/pgSQL - SQL¼ö¼Ó ¾ð¾î | Fast Forward | Next |
Äõ¸® Àüü¸¦ ÇÑ ¹ø¿¡ ½ÇÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, Ä¿¼¸¦ ¼³Á¤ÇØ, Äõ¸®¸¦ ĸ½¶ÈÇØ, Äõ¸®ÀÇ °á°ú¸¦ ÇÑ ¹ø¿¡ ¸î Áٱ⾿ Àо ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀ» ½Ç½ÃÇÏ´Â ÀÌÀ¯ÀÇ Çϳª´Â, °á°ú³»¿¡ ´Ù¼öÀÇ ÇàÀÌ ÀÖ´Â °æ¿ìÀÇ ¸Þ¸ð¸®ÀÇ °í°¥À» ¸·´Â °ÍÀÔ´Ï´Ù (±×·¯³ª,PL/pgSQL»ç¿ëÀÚ´Â Åë»ó À̰ÍÀ» °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. FOR·çÇÁ´Â ÀÚµ¿ÀûÀ¸·Î Ä¿¼¸¦ ³»ºÎÀûÀ¸·Î »ç¿ëÇØ ¸Þ¸ð¸®ÀÇ ¹®Á¦¸¦ ¸·±â ¶§¹®ÀÔ´Ï´Ù). º¸´Ù Èï¹Ì·Î¿î »ç¿ë ¹æ¹ýÀ¸·Î¼ È£ÃâÇØ ¿øÀÌ ÇàÀ» Àо´Â °ÍÀ» ÇÒ ¼ö ÀÖµµ·Ï, ÀÛ¼ºµÈ Ä¿¼¿¡ÀÇ ÂüÁ¶¸¦ µ¹·ÁÁÖ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, ÇÔ¼ö·ÎºÎÅÍ ´ë·®ÀÇ Çà ÁýÇÕÀ» µ¹·ÁÁÙ ¶§ÀÇ È¿À²ÀÌ Çâ»óÇÕ´Ï´Ù.
PL/pgSQL¿¡¼ÀÇ Ä¿¼¿¡ÀÇ Á¢±ÙÀº ¸ðµÎ, Ä¿¼ º¯¼ö¸¦ °æÀ¯ÇÕ´Ï´Ù. Ä¿¼ º¯¼ö´Â, Ç×»ó Æ¯¼öÇÑ refcursorµ¥ÀÌÅÍÇüÀÔ´Ï´Ù. Ä¿¼ º¯¼ö¸¦ ÀÛ¼ºÇÏ´Â 1°³ÀÇ ¹æ¹ýÀº, ´ÜÁö refcursorÇüÀÇ º¯¼ö·Î¼ ¼±¾ðÇÏ´Â °ÍÀÔ´Ï´Ù. ´Ù¸¥ ¹æ¹ýÀº, Ä¿¼ ¼±¾ð ±¸¹®À» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌÇÏ¿¡ ±× ÀϹÝÇüÀ» ³ªÅ¸³À´Ï´Ù.
name
CURSOR [ (
arguments
) ] FOR
query
;
(Oracle¿ÍÀÇ È£È¯¼ºÀ̱⠶§¹®¿¡, FOR´ÂIS¿¡ ¿Å°Ü³õÀ» ¼ö ÀÖ½À´Ï´Ù.) ¸¸¾à SCROLL¸¦ ÁöÁ¤Çϸé, Ä¿¼´Â ¿ª¹æÇâÀ¸·Î À̵¿ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à NO SCROLL¸¦ ÁöÁ¤Çϸé, ¿ª¹æÇâÀÇ ÇàÀÇ ÃëµæÀº ÇÒ ¼ö ¾ø½À´Ï´Ù. ¾î´À ÂÊÀ̳ª ÁöÁ¤ÇÏÁö ¾ÊÀ» ¶§, ¿ª¹æÇâÀ¸·Î Ãëµæ ÇÒ ¼ö ÀÖÀ»Áö´Â Äõ¸®¿¡ ÀÇÁ¸ÇÕ´Ï´Ù. ¸¸¾à arguments °¡ ÀÖÀ¸¸é, name datatype ¸¦ Äĸ¶·Î ´Ü¶ôÁöÀº ¸®½ºÆ®·Î, ÁÖ¾îÁø Äõ¸®³»ÀÇ ¸Å°³º¯¼ö°ªÀ¸·Î¼ ġȯµÇ´Â À̸§À» Á¤ÀÇÇÕ´Ï´Ù. ±× À̸§¿¡ ½ÇÁ¦·Î ġȯµÇ´Â °ªÀº, Ä¿¼¸¦ ¿¬ ½ÃÁ¡º¸´Ù ÈÄ·Î ÁöÁ¤µË´Ï´Ù.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
DECLARE
curs1 refcursor;
curs2 CURSOR FOR SELECT * FROM tenk1;
curs3 CURSOR (key integer) IS SELECT * FROM tenk1 WHERE unique1 = key;
À̰͵é 3°³ÀÇ º¯¼ö´Â ¸ðµÎ refcursorµ¥ÀÌÅÍÇüÀ» °¡Áý´Ï´Ù¸¸, ÃÖÃÊÀÇ °ÍÀº ¸ðµç Äõ¸®¿¡ »ç¿ëÇÒ ¼ö ÀÖ¾î 2¹øÂ°¿¡´Â ¿ÏÀüÇÑ Äõ¸®°¡ ÀÌ¹Ì ¹Ù¿îµåµÇ°í ÀÖ½À´Ï´Ù(¿¬°á½Ãų ¼ö ÀÖ°í ÀÖ½À´Ï´Ù). ¶Ç, ¸¶Áö¸· °Í¿¡´Â, ¸Å°³º¯¼ö ÷ºÎÀÇ Äõ¸®°¡ ¹Ù¿îµå µÇ°í ÀÖ½À´Ï´Ù (key´Â Ä¿¼°¡ ¿·ÈÀ» ¶§¿¡ Á¤¼ö ¸Å°³º¯¼ö°ªÀ¸·Î ¿Å°ÜÁý´Ï´Ù). curs1º¯¼ö´Â, ƯÁ¤ÀÇ Äõ¸®¿¡ ¹Ù¿îµåµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡, ¾ð¹Ù¿îµå¶ó°í ºÒ¸³´Ï´Ù.
Ä¿¼¸¦ »ç¿ëÇØ ÇàÀ» ²¨³»±â Àü¿¡, ¿¸± Çʿ䰡 ÀÖ½À´Ï´Ù (À̰ÍÀº DECLARE CURSOR SQL ¸í·ÉÀÇ µ¿ÀÛ°ú °°½À´Ï´Ù). PL/pgSQL¿¡´Â 3 Á¾·ùÀÇ OPEN¹®ÀÌ ÀÖ¾î, ±× ÁßÀÇ 2°¡Áö´Â ¾ð¹Ù¿îµå Ä¿¼ º¯¼ö¸¦ »ç¿ëÇØ, ³ª¸ÓÁöÀÇ Çϳª´Â ¹Ù¿îµå Ä¿¼ º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù.
OPEN unbound_cursor FOR query ;
Ä¿¼ º¯¼ö´Â ¿·Á ½ÇÇàÇϵµ·Ï ÁöÁ¤ÇÑ Äõ¸®°¡ ºÎ¿©µË´Ï´Ù. ÀÌ¹Ì ¿¬ Ä¿¼¸¦ ¿Áö ¸øÇϰí, ¶Ç, ¾ð¹Ù¿îµå Ä¿¼·Î¼(Áï, ´Ü¼øÇÑ refcursorº¯¼ö·Î¼) ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ Äõ¸®´Â SELECT¹®ÀÎÁö, ¶Ç´Â EXPLAIN¿Í °°ÀÌ ÇàÀ» µ¹·ÁÁÖ´Â °ÍÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ÀÌ SELECTÄõ¸®´Â, ´Ù¸¥ PL/pgSQLÀÇ SELECT¹®°ú °°Àº ¹æ¹ýÀ¸·Î ´Ù·ç¾îÁý´Ï´Ù. PL/pgSQLÀÇ º¯¼ö¸íÀº ¿Å°Ü³õÀ» ¼ö ÀÖ¾î Äõ¸® °èȹÀº ÀçÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ij½¬µË´Ï´Ù. PL/pgSQLº¯¼ö°¡ Ä¿¼¸¦ »ç¿ëÇÏ´Â Äõ¸®¿¡ ´ëÀԵǾúÀ» ¶§, º¯¼ö´Â OPEN½ÃÀÇ °ªÀÌ µÇ¾î, ±× ÈÄÀÇ º¯°æÀº Ä¿¼ÀÇ ¿òÁ÷ÀÓ¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù. ¹Ù¿îµå Ä¿¼¿¡ °üÇÑ SCROLL ¹× NO SCROLL¿É¼ÇÀÇ Àǹ̵µ ¸¶Âù°¡ÁöµË´Ï´Ù.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey;
OPEN unbound_cursor FOR EXECUTE query_string ;
Ä¿¼ º¯¼ö´Â ¿·Á ½ÇÇàÇϵµ·Ï ÁöÁ¤ÇÑ Äõ¸®°¡ ºÎ¿©µË´Ï´Ù. ÀÌ¹Ì ¿¬ Ä¿¼¸¦ ¿Áö ¸øÇϰí, ¶Ç, ¾ð¹Ù¿îµå Ä¿¼·Î¼(Áï, ´Ü¼øÇÑrefcursorº¯¼ö·Î¼) ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù. Äõ¸®´Â, EXECUTE¸í·É°ú °°Àº ¹æ¹ý¿¡ µû¸£´Â ¹®ÀÚ¿½ÄÀ¸·Î¼ ÁöÁ¤µË´Ï´Ù. Åë»ó°ú °°ÀÌ, À̰Ϳ¡ ÀÇÇØ, ´ÙÀ½¹ø¿¡ ½ÇÇàÇÒ ¶§¿¡ ´Ù¸¥ Äõ¸®¸¦ °èȹÇÒ ¼ö ÀÖ´Â À¯¿¬¼ºÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);
OPEN
bound_cursor
[ (
argument_values
) ];
¼±¾ð½Ã¿¡ Äõ¸®°¡ ¹Ù¿îµå µÈ Ä¿¼ º¯¼ö¸¦ ¿±â À§Çؼ »ç¿ëµÇ´Â OPENÀÇ Çü½ÄÀÔ´Ï´Ù. ÀÌ¹Ì ¿¬ Ä¿¼¸¦ ¿ ¼ö ¾ø½À´Ï´Ù. ½ÇÁ¦ ÀÎÀÚÀÇ Æò°¡½Ä ¸®½ºÆ®´Â Ä¿¼°¡ ÀÎÀÚ¸¦ ÃëÇÑ´Ù°í ¼±¾ðµÇ¾úÀ» °æ¿ì¿¡°Ô¸¸ ³ªÅ¸³³´Ï´Ù. ÀÌ·¯ÇÑ °ªÀº, Äõ¸® Áß¿¡¼ ¿Å°Ü³õÀ» ¼ö ÀÖ½À´Ï´Ù. ¹Ù¿îµå Ä¿¼ÀÇ Äõ¸® °èȹÀº Ç×»ó ij½¬ °¡´ÉÀ¸·Î °£ÁÖÇØÁý´Ï´Ù. ÀÌ °æ¿ì, EXECUTE¿Í µî°¡ÀÎ °ÍÀº ¾ø½À´Ï´Ù. SCROLL ¹× NO SCROLL¸¦ ÁöÁ¤ÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. Ä¿¼ À̵¿ÀÇ »ç¾çÀº ¹ú½á Á¤ÇØÁ® Àֱ⠶§¹®ÀÔ´Ï´Ù.
¿¹£º
OPEN curs2; OPEN curs3(42);
Ä¿¼¸¦ ¿°í ³ª¼, ¿©±â¼ ¼³¸íÇÏ´Â ¸í·É¹®À» »ç¿ëÇØ Ä¿¼¸¦ Ãë±ÞÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ·¯ÇÑ Á¶ÀÛÀº, Ä¿¼¸¦ °³½ÃÇϱâ À§Çؼ ¿¬ ÇÔ¼ö³»¿¡¼ ½Ç½ÃÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÇÔ¼ö·ÎºÎÅÍ refcursor°ªÀ» µ¹·ÁÁà, È£Ãâ¿øÀ¸·Î ±× Ä¿¼ÀÇ Á¶ÀÛÀ» ½Ãų ¼öµµ ÀÖ½À´Ï´Ù (³»ºÎÀûÀ¸·Î´Â refcursor°ªÀº, Ä¿¼¿¡ÀÇ À¯È¿ÇÑ Äõ¸®¸¦ °¡Áö´Â Æ÷ÅÐÀÇ À̸§À» ³ªÅ¸³»´Â ´Ü¼øÇÑ ¹®ÀÚ¿ÀÔ´Ï´Ù. ÀÌ À̸§Àº, Æ÷ÅÐÀ» ºÎ¼ö´Â ÀÏ ¾øÀÌ, ´Ù¸¥ refcursorÇüÀÇ º¯¼ö¿¡ ´ëÀÔÇÏ´Â °ÍÀ¸·Î, ±× ¹ÛÀ¸·Î °Ç³×ÁÙ ¼ö ÀÖ½À´Ï´Ù).
¸ðµç Æ÷ÅÐÀº, ¾Ï¹¬ÀûÀ¸·Î Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·¿¡ ´ÝÈü´Ï´Ù. µû¶ó¼, refcursor°ªÀº ±× Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·±îÁöÀÇ »çÀ̸¸ ¿¬ Ä¿¼¿¡ÀÇ ÂüÁ¶·Î¼ À¯È¿ÇÕ´Ï´Ù.
FETCH cursor INTO target ;
FETCH´ÂSELECT INTO¿Í °°°Ô, Ä¿¼·ÎºÎÅÍ ´ÙÀ½ÀÇ ÇàÀ» ÃßÃâÇØ, ´ë»óÀ¸·Î ÀúÀåÇÕ´Ï´Ù. ´ë»óÀ̶õ, Çà º¯¼ö, ·¹ÄÚµå º¯¼ö, ¶Ç´Â ´Ü¼øÇÑ º¯¼ö¸¦ ĸ¶·Î ´Ü¶ôÁöÀº ¸®½ºÆ®ÀÔ´Ï´Ù. SELECT INTOÀÇ °æ¿ì¿Í °°ÀÌ, Ư¼öÇÑ FOUNDº¯¼ö¸¦ °Ë»çÇÏ´Â °ÍÀ¸·Î, ÇàÀ» ÀÔ¼öÇÒ ¼ö ÀÖ¾ú´ÂÁö ¾ø¾ú´ÂÁö¸¦ È®ÀÎÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.
¿¹£º
FETCH curs1 INTO rowvar; FETCH curs2 INTO foo, bar, baz;
CLOSE cursor ;
CLOSE´Â Æ÷ÅÐÀÇ ¹èÈÄÀÇ Ä¿¼¸¦ ´Ý½À´Ï´Ù. À̰ÍÀ» »ç¿ëÇØ Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·º¸´Ù Àü¿¡ ÀÚ¿øÀ» ÇØ¹æÇÒ ¼ö°¡ ÀÖ¾î ¶Ç, Ä¿¼ º¯¼ö¸¦ ÇØ¹æÇØ, ÀçÂ÷ ¿ ¼ö°¡ ÀÖ½À´Ï´Ù.
¿¹£º
CLOSE curs1;
PL/pgSQLÇÔ¼ö¿¡¼´Â, È£Ãâ ¹ÙÅÁÀ¸·Î Ä¿¼¸¦ µ¹·ÁÁÙ ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀº, ÇÔ¼ö·ÎºÎÅÍ º¹¼öÇà ¶Ç´Â º¹¼ö¿À» µ¹·ÁÁÖ´Â °æ¿ì, ƯÈ÷ ±× °á°ú ÁýÇÕÀÌ ¸Å¿ì Å« °æ¿ì¿¡ »ç¿ëÇÕ´Ï´Ù. À̰ÍÀ» ½Ç½ÃÇÏ·Á¸é, ÇÔ¼ö´Â, Ä¿¼¸¦ ¿¾î, È£Ãâ ¹ÙÅÁÀ¸·Î Ä¿¼¸íÀ» µ¹·ÁÁÝ´Ï´Ù (ȤÀº, ¸¸¾à È£ÃâÇØ ¿øÀ¸·Î Æ÷ÅиíÀ» ¾Ë ¼ö ÀÖ°í ÀÖÀ¸¸é, ´Ü¼øÇÏ°Ô ÁöÁ¤µÈ Æ÷ÅиíÀ» »ç¿ëÇØ Ä¿¼¸¦ ¿±´Ï´Ù). À̰Ϳ¡ ÀÇÇØ, È£Ãâ¿ø·¡´Â, Ä¿¼·ÎºÎÅÍ ÇàÀ» ²¨³¾ ¼ö ÀÖ°Ô µË´Ï´Ù. Ä¿¼´Â, È£Ãâ¿øÀ¸·Î ´ÝÀ» ¼ö ÀÖ½À´Ï´Ù. ¶Ç´Â, Æ®·£Àè¼ÇÀÌ Á¾·áÇßÀ» ¶§¿¡ ÀÚµ¿ÀûÀ¸·Î ´ÝÇôÁý´Ï´Ù.
Ä¿¼¿ëÀÇ Æ÷ÅиíÀº, ÇÁ·Î±×·¡¸Ó°¡ ÁöÁ¤ÇÏ´ÂÁö, ¶Ç´Â ÀÚµ¿À¸·Î »ý¼ºµË´Ï´Ù. Æ÷ÅиíÀ» ÁöÁ¤ÇÏ·Á¸é , ¿±â Àü¿¡, ´ÜÁö refcursorº¯¼ö¿¡ ¹®ÀÚ¿À» ´ëÀÔÇÕ´Ï´Ù. refcursorº¯¼öÀÇ ¹®ÀÚ¿°ªÀº OPEN¿¡ ÀÇÇØ, ¹èÈÄÀÇ Æ÷ÅиíÀ¸·Î¼ »ç¿ëµË´Ï´Ù. ±×·¯³ª, refcursorº¯¼ö°¡ NULLÀÇ °æ¿ì, OPEN´Â ÀÚµ¿ÀûÀ¸·Î ±âÁ¸ÀÇ Æ÷Åаú Ãæµ¹ÇÏÁö ¾Ê´Â À̸§À» »ý¼ºÇØ, ±×°ÍÀ» refcursorº¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
Note: ¹Ù¿îµå Ä¿¼ º¯¼ö´Â, ±× À̸§À» Ç¥ÇöÇÏ´Â ¹®ÀÚ¿°ªÀ¸·Î Ãʱâȵ˴ϴÙ. ±× ¶§¹®¿¡, ÇÁ·Î±×·¡¸Ó°¡ Ä¿¼¸¦ ¿±â Àü¿¡ ´ëÀÔ¿¡ ÀÇÇØ µ¡¾²±âÇÏÁö ¾Ê´Â ÇÑ, Æ÷ÅиíÀº Ä¿¼ º¯¼ö¿Í °°°Ô µË´Ï´Ù. ±×·¯³ª, ¾ð¹Ù¿îµå Ä¿¼ º¯¼öÀÇ ÃʱⰪÀº ±âº»°ªÀ¸·Î NULLÀÔ´Ï´Ù. ±× ¶§¹®¿¡, µ¡¾²±âµÇÁö ¾ÊÀº °æ¿ì¿¡ ÀÚµ¿ÀûÀ¸·Î »ý¼ºµÈ À¯ÀÏÇÑ À̸§À» ¹Þ½À´Ï´Ù.
ÀÌÇÏÀÇ ¿¹´Â, È£Ãâ¿øÀ¸·Î Ä¿¼¸íÀ» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
CREATE TABLE test (col text);
INSERT INTO test VALUES ('123');
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
' LANGUAGE plpgsql;
BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
ÀÌÇÏÀÇ ¿¹¿¡¼´Â, ÀÚµ¿ Ä¿¼¸í »ý¼ºÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù.
CREATE FUNCTION reffunc2() RETURNS refcursor AS '
DECLARE
ref refcursor;
BEGIN
OPEN ref FOR SELECT col FROM test;
RETURN ref;
END;
' LANGUAGE plpgsql;
BEGIN;
SELECT reffunc2();
reffunc2
--------------------
<unnamed cursor 1>
(1 row)
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;
ÀÌÇÏÀÇ ¿¹´Â ´ÜÀÏ ÇÔ¼ö·ÎºÎÅÍ º¹¼öÀÇ Ä¿¼¸¦ µ¹·ÁÁÖ´Â ¹æ¹ýÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;
-- Ä¿¼¸¦ »ç¿ëÇÏ·Á¸é, Æ®·£Àè¼Ç ³»ºÎÀÏ Çʿ䰡 ÀÖ½À´Ï´Ù.
BEGIN;
SELECT * FROM myfunc('a', 'b');
FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;