37.8. Cursors

Äõ¸® Àüü¸¦ ÇÑ ¹ø¿¡ ½ÇÇàÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, Ä¿¼­¸¦ ¼³Á¤ÇØ, Äõ¸®¸¦ ĸ½¶È­ÇØ, Äõ¸®ÀÇ °á°ú¸¦ ÇÑ ¹ø¿¡ ¸î Áٱ⾿ Àо ¼ö°¡ ÀÖ½À´Ï´Ù. À̰ÍÀ» ½Ç½ÃÇÏ´Â ÀÌÀ¯ÀÇ Çϳª´Â, °á°ú³»¿¡ ´Ù¼öÀÇ ÇàÀÌ ÀÖ´Â °æ¿ìÀÇ ¸Þ¸ð¸®ÀÇ °í°¥À» ¸·´Â °ÍÀÔ´Ï´Ù (±×·¯³ª,PL/pgSQL»ç¿ëÀÚ´Â Åë»ó À̰ÍÀ» °ÆÁ¤ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. FOR·çÇÁ´Â ÀÚµ¿ÀûÀ¸·Î Ä¿¼­¸¦ ³»ºÎÀûÀ¸·Î »ç¿ëÇØ ¸Þ¸ð¸®ÀÇ ¹®Á¦¸¦ ¸·±â ¶§¹®ÀÔ´Ï´Ù). º¸´Ù Èï¹Ì·Î¿î »ç¿ë ¹æ¹ýÀ¸·Î¼­ È£ÃâÇØ ¿øÀÌ ÇàÀ» Àо´Â °ÍÀ» ÇÒ ¼ö ÀÖµµ·Ï, ÀÛ¼ºµÈ Ä¿¼­¿¡ÀÇ ÂüÁ¶¸¦ µ¹·ÁÁÖ´Â ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, ÇÔ¼ö·ÎºÎÅÍ ´ë·®ÀÇ Çà ÁýÇÕÀ» µ¹·ÁÁÙ ¶§ÀÇ È¿À²ÀÌ Çâ»óÇÕ´Ï´Ù.

37.8.1. Ä¿¼­ º¯¼öÀÇ ¼±¾ð

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º¯¼ö´Â, ƯÁ¤ÀÇ Äõ¸®¿¡ ¹Ù¿îµåµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡, ¾ð¹Ù¿îµå¶ó°í ºÒ¸³´Ï´Ù.

37.8.2. Ä¿¼­ ¿­±â

Ä¿¼­¸¦ »ç¿ëÇØ ÇàÀ» ²¨³»±â Àü¿¡, ¿­¸± Çʿ䰡 ÀÖ½À´Ï´Ù (À̰ÍÀº DECLARE CURSOR SQL ¸í·ÉÀÇ µ¿ÀÛ°ú °°½À´Ï´Ù). PL/pgSQL¿¡´Â 3 Á¾·ùÀÇ OPEN¹®ÀÌ ÀÖ¾î, ±× ÁßÀÇ 2°¡Áö´Â ¾ð¹Ù¿îµå Ä¿¼­ º¯¼ö¸¦ »ç¿ëÇØ, ³ª¸ÓÁöÀÇ Çϳª´Â ¹Ù¿îµå Ä¿¼­ º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù.

37.8.2.1. OPEN FOR query

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;

37.8.2.2. OPEN FOR EXECUTE

OPEN 
unbound_cursor
 FOR EXECUTE 
query_string
;

Ä¿¼­ º¯¼ö´Â ¿­·Á ½ÇÇàÇϵµ·Ï ÁöÁ¤ÇÑ Äõ¸®°¡ ºÎ¿©µË´Ï´Ù. ÀÌ¹Ì ¿¬ Ä¿¼­¸¦ ¿­Áö ¸øÇϰí, ¶Ç, ¾ð¹Ù¿îµå Ä¿¼­·Î¼­(Áï, ´Ü¼øÇÑrefcursorº¯¼ö·Î¼­) ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù. Äõ¸®´Â, EXECUTE¸í·É°ú °°Àº ¹æ¹ý¿¡ µû¸£´Â ¹®ÀÚ¿­½ÄÀ¸·Î¼­ ÁöÁ¤µË´Ï´Ù. Åë»ó°ú °°ÀÌ, À̰Ϳ¡ ÀÇÇØ, ´ÙÀ½¹ø¿¡ ½ÇÇàÇÒ ¶§¿¡ ´Ù¸¥ Äõ¸®¸¦ °èȹÇÒ ¼ö ÀÖ´Â À¯¿¬¼ºÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.

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

OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);

37.8.2.3. ¹Ù¿îµå Ä¿¼­ ¿­±â

OPEN 
bound_cursor
 [ ( 
argument_values
 ) ];

¼±¾ð½Ã¿¡ Äõ¸®°¡ ¹Ù¿îµå µÈ Ä¿¼­ º¯¼ö¸¦ ¿­±â À§Çؼ­ »ç¿ëµÇ´Â OPENÀÇ Çü½ÄÀÔ´Ï´Ù. ÀÌ¹Ì ¿¬ Ä¿¼­¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù. ½ÇÁ¦ ÀÎÀÚÀÇ Æò°¡½Ä ¸®½ºÆ®´Â Ä¿¼­°¡ ÀÎÀÚ¸¦ ÃëÇÑ´Ù°í ¼±¾ðµÇ¾úÀ» °æ¿ì¿¡°Ô¸¸ ³ªÅ¸³³´Ï´Ù. ÀÌ·¯ÇÑ °ªÀº, Äõ¸® Áß¿¡¼­ ¿Å°Ü³õÀ» ¼ö ÀÖ½À´Ï´Ù. ¹Ù¿îµå Ä¿¼­ÀÇ Äõ¸® °èȹÀº Ç×»ó ij½¬ °¡´ÉÀ¸·Î °£ÁÖÇØÁý´Ï´Ù. ÀÌ °æ¿ì, EXECUTE¿Í µî°¡ÀÎ °ÍÀº ¾ø½À´Ï´Ù. SCROLL ¹× NO SCROLL¸¦ ÁöÁ¤ÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. Ä¿¼­ À̵¿ÀÇ »ç¾çÀº ¹ú½á Á¤ÇØÁ® Àֱ⠶§¹®ÀÔ´Ï´Ù.

¿¹£º

OPEN curs2;
OPEN curs3(42);

37.8.3. Ä¿¼­ÀÇ »ç¿ë

Ä¿¼­¸¦ ¿­°í ³ª¼­, ¿©±â¼­ ¼³¸íÇÏ´Â ¸í·É¹®À» »ç¿ëÇØ Ä¿¼­¸¦ Ãë±ÞÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¯ÇÑ Á¶ÀÛÀº, Ä¿¼­¸¦ °³½ÃÇϱâ À§Çؼ­ ¿¬ ÇÔ¼ö³»¿¡¼­ ½Ç½ÃÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÇÔ¼ö·ÎºÎÅÍ refcursor°ªÀ» µ¹·ÁÁà, È£Ãâ¿øÀ¸·Î ±× Ä¿¼­ÀÇ Á¶ÀÛÀ» ½Ãų ¼öµµ ÀÖ½À´Ï´Ù (³»ºÎÀûÀ¸·Î´Â refcursor°ªÀº, Ä¿¼­¿¡ÀÇ À¯È¿ÇÑ Äõ¸®¸¦ °¡Áö´Â Æ÷ÅÐÀÇ À̸§À» ³ªÅ¸³»´Â ´Ü¼øÇÑ ¹®ÀÚ¿­ÀÔ´Ï´Ù. ÀÌ À̸§Àº, Æ÷ÅÐÀ» ºÎ¼ö´Â ÀÏ ¾øÀÌ, ´Ù¸¥ refcursorÇüÀÇ º¯¼ö¿¡ ´ëÀÔÇÏ´Â °ÍÀ¸·Î, ±× ¹ÛÀ¸·Î °Ç³×ÁÙ ¼ö ÀÖ½À´Ï´Ù).

¸ðµç Æ÷ÅÐÀº, ¾Ï¹¬ÀûÀ¸·Î Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·¿¡ ´ÝÈü´Ï´Ù. µû¶ó¼­, refcursor°ªÀº ±× Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·±îÁöÀÇ »çÀ̸¸ ¿¬ Ä¿¼­¿¡ÀÇ ÂüÁ¶·Î¼­ À¯È¿ÇÕ´Ï´Ù.

37.8.3.1. FETCH

FETCH 
cursor
 INTO 
target
;

FETCH´ÂSELECT INTO¿Í °°°Ô, Ä¿¼­·ÎºÎÅÍ ´ÙÀ½ÀÇ ÇàÀ» ÃßÃâÇØ, ´ë»óÀ¸·Î ÀúÀåÇÕ´Ï´Ù. ´ë»óÀ̶õ, Çà º¯¼ö, ·¹ÄÚµå º¯¼ö, ¶Ç´Â ´Ü¼øÇÑ º¯¼ö¸¦ Ä­¸¶·Î ´Ü¶ôÁöÀº ¸®½ºÆ®ÀÔ´Ï´Ù. SELECT INTOÀÇ °æ¿ì¿Í °°ÀÌ, Ư¼öÇÑ FOUNDº¯¼ö¸¦ °Ë»çÇÏ´Â °ÍÀ¸·Î, ÇàÀ» ÀÔ¼öÇÒ ¼ö ÀÖ¾ú´ÂÁö ¾ø¾ú´ÂÁö¸¦ È®ÀÎÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

¿¹£º

FETCH curs1 INTO rowvar;
FETCH curs2 INTO foo, bar, baz;

37.8.3.2. CLOSE

CLOSE 
cursor
;

CLOSE´Â Æ÷ÅÐÀÇ ¹èÈÄÀÇ Ä¿¼­¸¦ ´Ý½À´Ï´Ù. À̰ÍÀ» »ç¿ëÇØ Æ®·£Àè¼ÇÀÇ ¸¶Áö¸·º¸´Ù Àü¿¡ ÀÚ¿øÀ» ÇØ¹æÇÒ ¼ö°¡ ÀÖ¾î ¶Ç, Ä¿¼­ º¯¼ö¸¦ ÇØ¹æÇØ, ÀçÂ÷ ¿­ ¼ö°¡ ÀÖ½À´Ï´Ù.

¿¹£º

CLOSE curs1;

37.8.3.3. Ä¿¼­ÀÇ ¹Ýȯ

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;