| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 37. PL/pgSQL - SQL¼ö¼Ó ¾ð¾î | Fast Forward | Next |
º»Àý ¹× Â÷Àý¿¡¼´Â, ¸í½ÃÀûÀ¸·Î PL/pgSQL·Î ÇØ¼®µÇ´Â, ¸ðµç Á¾·ùÀÇ ¸í·É¹®¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Á¾·ùÀÇ ¸í·É¹®À¸·Î¼ ÀÎÁ¤µÇÁö ¾Ê´Â °ÍÀº ¸ðµÎ, SQL ¸í·ÉÀ̶ó°í °¡Á¤µÇ¾î Section 37.6.2 ¹× Section 37.6.3¿¡ ±â¼úÇÑ °Íó·³, ¸ÞÀÎ µ¥ÀÌÅͺ£À̽º ¿£Áø¿¡ ¼Û½ÅµÇ°í ½ÇÇàµË´Ï´Ù.
°ªÀ» PL/pgSQLº¯¼ö, ȤÀº Çà/·¹ÄÚµå Çʵ忡 ´ëÀÔÇÏ´Â °æ¿ì´Â ÀÌÇÏ¿Í °°ÀÌ ±â¼úÇÕ´Ï´Ù.
identifier := expression ;
»ó¼úÇÑ ´ë·Î, ÀÌ·¯ÇÑ ¸í·É¹®Áß¿¡ ÀÖ´Â ½ÄÀº, ¸ÞÀÎ µ¥ÀÌÅͺ£À̽º ¿£Áø¿¡ ¼Û½ÅµÇ´Â SELECT SQL ¸í·É¿¡ ÀÇÇØ Æò°¡µË´Ï´Ù. ½ÄÀº 1°³ÀÇ °ªÀ» »ý¼ºÇØ¾ß ÇÕ´Ï´Ù.
½ÄÀÇ °á°ú µ¥ÀÌÅÍÇüÀÌ º¯¼öÀÇ µ¥ÀÌÅÍÇü¿¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â °æ¿ì, ¶Ç´Â, º¯¼ö°¡(char(20)¿Í °°ÀÌ) ƯÁ¤ÀÇ Å©±â/Á¤¹Ðµµ¸¦ °¡Áö´Â °æ¿ì, °á°úÀÇ °ªÀº PL/pgSQLÀÎÅÍÇÁ¸®ÅÍ¿¡ ÀÇÇØ, °á°úÀÇ ÇüÅÂÀÇ Ãâ·Â ÇÔ¼ö¿Í º¯¼öÀÇ ÇüÅÂÀÇ ÀÔ·Â ÇÔ¼ö¸¦ »ç¿ëÇØ ¾Ï¹¬ÀûÀ¸·Î º¯È¯µË´Ï´Ù. À̰Ϳ¡ ÀÇÇØ, °á°ú°ªÀÇ ¹®ÀÚ¿ Çü½ÄÀ» ÀÔ·Â ÇÔ¼ö·Î ¹Þ¾ÆµéÀÏ ¼ö°¡ ¾ø´Â °æ¿ì¿¡, ÀÔ·Â ÇÔ¼ö¿¡ ´ëÇØ ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.
·Ê£º
user_id := 20; tax := subtotal * 0.06;
¿¹¸¦ µé¸é, RETURNING±¸°¡ ¾ø´Â INSERT¿Í °°ÀÌ, ÇàÀ» µ¹·ÁÁÖÁö ¾Ê´Â SQL Äõ¸®¿¡ ´ëÇØ, ´ÜÁö ±â¼úÇÏ´Â °Í¿¡ ÀÇÇØ PL/pgSQLÇÔ¼öÀÇ ³»ºÎ¿¡¼ Äõ¸®¸¦ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.
Äõ¸® ÅØ½ºÆ®¿¡ ³ªÅ¸³ª´Â ¸ðµç PL/pgSQLº¯¼ö¸íµµ, ¸Å°³º¯¼öÀÇ ½Éº¼·Î ¿Å°ÜÁý´Ï´Ù. ±× ÈÄ, ½ÇÇà½ÃÀÇ ¸Å°³º¯¼ö°ªÀ¸·Î¼ ±× ½ÃÁ¡ÀÇ º¯¼ö°ªÀÌ Á¦°øµË´Ï´Ù. À̰ÍÀº ÇÔ¼öÀÇ ´Ù¸¥ ÄÝ¿¡ ´Ù¸¥ ÀÏÀ» ÇÏ´Â °°Àº ÅØ½ºÆ® Äõ¸®¿¡ Çã¿ëµË´Ï´Ù.
Note: 2 ´Ü°è ÇÁ·Î¼¼½º°¡ Äõ¸®¸¦ °èȹÇϰí, ¼ºê½ÃÄöÆ® ½ÇÇà°èȹÀ» Àç»ç¿ëÇϱâ À§ÇØ PL/pgSQL¸¦ Çã¿ëÇÕ´Ï´Ù. ±× ¿¹·Î¼ ´ÙÀ½°ú °°ÀÌ ¾µ ¼ö ÀÖ½À´Ï´Ù.
DECLARE key TEXT; delta INTEGER; BEGIN ... UPDATE mytab SET val = val + delta WHERE id = key;Äõ¸® ÅØ½ºÆ®´Â, SQL ÁÖ¿£ÁøÀ¸·ÎºÎÅÍ ¾Æ·¡¿Í °°ÀÌ º¸ÀÔ´Ï´Ù.
UPDATE mytab SET val = val + $1 WHERE id = $2;Åë»ó ÀÌ¿Í °°ÀÌ »ý°¢ÇÒ °ÍÀº ¾ø½À´Ï´Ù¸¸, ±¸¹® ¿¡·¯ ¸Þ¼¼ÁöÀÇ ÇØ¼®·ÂÀÌ ÇÊ¿äÇÑ ¶§´Â, ÀÌ ÇØ¼®ÀÌ À¯¿ëÀÌ µË´Ï´Ù.
| Caution |
|
PL/pgSQL´Â, ÇÔ¼ö¿¡ ´ëÇØ ¼±¾ðÇÑ º¯¼ö¿Í ÀÏÄ¡ÇÏ´Â ¸ðµç ½Äº°ÀÚ¿¡ÀÇ Ä¡È¯À» ½Ç½ÃÇÕ´Ï´Ù. µû¶ó¼, ÇÔ¼ö³»ÀÇ ¸í·ÉÀ¸·Î ÂüÁ¶ÇØ¾ß ÇÏ´Â Å×À̺í¸í, ·Ä¸í ¶Ç´Â ÇÔ¼ö¸í°ú °°Àº À̸§À» º¯¼ö¿¡ »ç¿ëÇÏ´Â °ÍÀº, ºÎÀûÀýÇÑ »ý°¢ÀÔ´Ï´Ù. |
½Ä ¶Ç´Â Äõ¸®SELECT¸¦ Æò°¡ÇØ °á°ú¸¦ ÆÄ±âÇÏ´Â °ÍÀÌ, µµ¿òÀÌ µÇ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀÇ È£Ãâ¿¡ ´ëÇØ, ºÎÂ÷ÀûÀÎ ¼º°ú¸¦ ÃëµæÇÒ ¼ö ÀÖÁö¸¸, °á°ú´Â ¼Ò¿ë¾ø´Â °æ¿ìÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¶§ PL/pgSQL¿¡¼´Â, PERFORM¹®À» »ç¿ëÇØ ÁÖ¼¼¿ä.
PERFORM query ;
À̰ÍÀº query ¸¦ ½ÇÇàÇØ, ±× °á°ú¸¦ ÆÄ±âÇÕ´Ï´Ù. SQLÀÇ SELECT¸í·É¹®°ú °°Àº ¹æ¹ýÀ¸·Î Äõ¸® ¸¦ ±â¼úÇÕ´Ï´Ù¸¸, ÃÖÃÊÀÇ Å°¿öµå SELECT¸¦ PERFORM¿¡ ¿Å°Ü³õ¾Æ ÁÖ¼¼¿ä. PL/pgSQLº¯¼ö´Â ¿©´À¶§Ã³·³ Äõ¸®¿¡ ġȯµË´Ï´Ù. ¶Ç, Ư¼öÇÑ º¯¼öÀÎ FOUND´Â Äõ¸® °á°ú°¡ 1Çà¿¡¼ »ý¼ºµÇ¾úÀ» °æ¿ì´Â ÂüÀ¸·Î ¼³Á¤µÇ°í, »ý¼ºµÇÁö ¾Ê´Â °æ¿ì´Â °ÅÁþÀ¸·Î ¼³Á¤µË´Ï´Ù(Section 37.6.6¸¦ ºÁ ÁÖ¼¼¿ä).
Note: Á÷Á¢ SELECT¸¦ ±â¼úÇϸé, ÀÌ °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù°í »ý°¢ÇÒÁöµµ ¸ð¸¨´Ï´Ù¸¸, Çö½ÃÁ¡¿¡¼ À̰ÍÀ» ½Ç½ÃÇÏ´Â ¹æ¹ýÀº PERFORM¹Û¿¡ ¾ø½À´Ï´Ù. SELECT¿Í °°ÀÌ ÇàÀ» µ¹·ÁÁÖ´Â SQL ¸í·ÉÀº, ¿¡·¯·Î¼ °ÅÀýµË´Ï´Ù. INTO±¸¸¦ °¡Áú ¶§´Â ¿¹¿ÜÀ̸ç, ´ÙÀ½ ¼½¼Ç¿¡¼ ¼³¸íÇÕ´Ï´Ù.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
PERFORM create_mv('cs_session_page_requests_mv', my_query);
1ÇàÀ» µ¹·ÁÁÖ´Â(¾Æ¸¶, º¹¼ö¿ÀÇ) SQL ¸í·ÉÀÇ °á°ú´Â, ·¹ÄÚµå º¯¼ö, ÇàÇüÀÇ º¯¼ö, ½ºÄ®¶ó º¯¼öÀÇ ¸®½ºÆ®¿¡ ´ëÀÔÇÒ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº, ±âº»ÀûÀÎ SQL ¸í·ÉÀ» ±â¼úÇØ, °Å±â¿¡ INTO±¸¸¦ Ãß°¡ÇÏ´Â °Í¿¡ ÀÇÇØ ÇàÇØÁý´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
SELECT select_expressions INTO [STRICT] target FROM ...; INSERT ... RETURNING expressions INTO [STRICT] target ; UPDATE ... RETURNING expressions INTO [STRICT] target ; DELETE ... RETURNING expressions INTO [STRICT] target ;
¿©±â¼, target ´Â ·¹ÄÚµå º¯¼ö, Çà º¯¼ö, ȤÀº, ´Ü¼øÇÑ º¯¼ö¿Í ·¹ÄÚµå/Çà º¯¼öÀÇ Çʵ带 Äĸ¶·Î ´Ü¶ôÁöÀº ¸®½ºÆ®ÀÔ´Ï´Ù. PL/pgSQLº¯¼ö´Â ġȯµÇ¾î ³ª¸ÓÁöÀÇ Äõ¸®°¡ µË´Ï´Ù. ÀÌ¿Í °°ÀÌ ÀÛµ¿ÇÏ´Â °ÍÀº, RETURNING¸¦ ¼ö¹ÝÇÑ INSERT/UPDATE/DELETE¿Í SELECT ¹× Çà ¼¼Æ®ÀÇ °á°ú¸¦ µ¹·ÁÁÖ´Â À¯Æ¿¸®Æ¼ ¸í·É(¿¹¸¦ µé¸é,EXPLAIN)ÀÔ´Ï´Ù. INTO±¸ À̿ܿ¡´Â, SQL ¸í·ÉÀº PL/pgSQLÀÇ ¿ÜºÎ¿¡ ±â¼úÇÑ °Í °Í°ú °°½À´Ï´Ù.
Tip: Åë»óÀÇ PostgreSQLÀÇ SELECT INTO¹®¿¡¼´Â, INTOÀÇ ´ë»óÀº »õ·Ó°Ô ÀÛ¼ºµÇ´Â Å×À̺íÀÔ´Ï´Ù. ±×·¯³ª, INTO¸¦ ¼ö¹ÝÇÑ SELECT¿¡¼´Â, ÀÌ ÇØ¼®ÀÌ ÀϹÝÀûÀÎ °Í°ú Å©°Ô ´Ù¸¥ °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. PL/pgSQL ÇÔ¼ö ³»ºÎ¿¡¼ SELECTÀÇ °á°ú·ÎºÎÅÍ Å×À̺íÀ» ÀÛ¼ºÇÏ°í ½ÍÀº °æ¿ì´Â, CREATE TABLE ... AS SELECT±¸¹®À» »ç¿ëÇØ ÁÖ¼¼¿ä.
Çà ¶Ç´Â º¯¼ö ¸®½ºÆ®°¡ ´ë»óÀ¸·Î »ç¿ëµÇ¾úÀ» °æ¿ì, ·Ä¼ö¿Í µ¥ÀÌÅÍÇü¿¡ ´ëÇØ Äõ¸®ÀÇ °á°ú¿Í ´ë»óÀÇ ±¸Á¶°¡ Á¤È®ÇÏ°Ô ÀÏÄ¡ÇØ¾ßÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ·¹ÄÚµå º¯¼ö°¡ ´ë»óÀÇ °æ¿ì, Äõ¸® °á°úÀÇ ¿ÀÇ ÇàÇü¿¡ ÀÚ±â ÀÚ½ÅÀ» ÀÚµ¿ÀûÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù.
INTO±¸´Â SQL ¸í·ÉÀÇ °ÅÀÇ ¾Æ¹« Àå¼Ò¿¡³ª ±â¼úÇÒ ¼ö ÀÖ½À´Ï´Ù. °ü½ÀÀûÀ¸·Î´Â, SELECT¹®¿¡ ´ëÇØ select_expressions ÀÇ Á÷Àü ¶Ç´Â Á÷ÈÄ¿¡, ´Ù¸¥ ¸í·É¿¡ ´ëÇØ ¸í·É¹®ÀÇ ¸¶Áö¸·¿¡ ±â¼úµË´Ï´Ù. ÇâÈÄ, PL/pgSQLÀÇ ÆÄ¼°¡ ¾ö°ÝÇÏ°Ô µÇ´Â °æ¿ì¿¡ ´ëºñÇØ, ÀÌ °ü½À¿¡ µû¸£´Â °ÍÀ» Ãßõ ÇÕ´Ï´Ù.
INTO±¸¿¡ ´ëÇØ STRICT°¡ ÁöÁ¤µÇÁö ¾Ê´Â °æ¿ì, target ´Â Äõ¸®°¡ µ¹·ÁÁÖ´Â ÃÖÃÊÀÇ ÇàÀÌ µÇ¾î, ÇàÀ» µ¹·ÁÁÖÁö ¾ÊÀ» ¶§´Â NULLÀÌ µË´Ï´Ù. ("tÃÖÃÊÀÇ Çà"Àº ORDER BY¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù°í Á¤ÀÇÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. ) 2Çà° ÀÌÈÄÀÇ ÇàÀÇ °á°ú´Â, ¸ðµÎ ÆÄ±âµË´Ï´Ù. Ư¼öÇÑ FOUNDº¯¼ö¸¦ Á¶»çÇØ, ¾î´À ÇàÀÌ µ¹·ÁÁÖ¾îÁ³´ÂÁö ¾Ë ¼ö ÀÖ½À´Ï´Ù. (Section 37.6.6¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä) ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
SELECT * INTO myrec FROM emp WHERE empname = myname;
IF NOT FOUND THEN
RAISE EXCEPTION 'employee % not found', myname;
END IF;
STRICT¿É¼ÇÀÌ ÁöÁ¤µÇ¾úÀ» °æ¿ì, Äõ¸®´Â Á¤È®ÇÏ°Ô 1ÇàÀ» µ¹·ÁÁà¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ÇàÀÌ ¾øÀ» ¶§´Â NO_DATA_FOUND, 2Çà ÀÌ»óÀÌ µ¹¾Æ°¬À» ¶§´Â TOO_MANY_ROWSÀÇ ½ÇÇà½Ã ¿¡·¯°¡ »ý±é´Ï´Ù. ¿¡·¯¸¦ Æ÷ÂøÇÏ°í ½ÍÀ» ¶§´Â, ¿¹¿Ü ºí·ÏÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
BEGIN
SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'employee % not found', myname;
WHEN TOO_MANY_ROWS THEN
RAISE EXCEPTION 'employee % not unique', myname;
END;
STRICT¸¦ ÁöÁ¤ÇÑ ¸í·ÉÀÌ ¼º°øÇϱâ À§Çؼ´Â, FOUNDº¯¼ö¸¦ Ç×»ó ÂüÀ¸·Î ¼³Á¤ÇØ ÁÖ¼¼¿ä.
STRICT°¡ ÁöÁ¤µÇÁö ¾Ê´Â °æ¿ì¿¡¼µµ, RETURNING¸¦ ¼ö¹ÝÇÑ INSERT/UPDATE/DELETE°¡ 2Çà ÀÌ»óÀ» µ¹·ÁÁÖ¾úÀ» ¶§´Â, ¿¡·¯°¡ µË´Ï´Ù. ¿Ö³ÄÇϸé, ¾î´À 1ÇàÀ» µ¹·ÁÁÙÁö °áÁ¤ÇÏ´Â ORDER BY¿Í °°Àº ¿É¼ÇÀÌ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.
Note: STRICT¿É¼ÇÀº, OracleÀÇ PL/SQLÀÇ SELECT INTO¹× °ü·ÃÇÑ ¸í·É¹®¿¡ ´ëÀÀÇÕ´Ï´Ù.
SQLÀÇ Äõ¸®°¡ µ¹·ÁÁÖ´Â º¹¼öÇàÀÇ °á°ú¸¦ ó¸®ÇÏ°í ½ÍÀº °æ¿ì´Â, Section 37.7.4À» ÂüÁ¶ÇØ ÁÖ¼¼¿ä.
¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â Ç÷¹À̽ºÈ¦´õ¹®ÀÌ À¯¿ëÇÏ°Ô µÇ´Â ÀÏÀÌ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, IF/THEN/ELSE¹®ÀÇ ÀϺΰ¡ °ø¹®ÀÎ °ÍÀ» ¸í½ÃÇÏ°í ½ÍÀ» ¶§ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¸ñÀûÀ¸·Î´Â, NULL¹®À» »ç¿ëÇÕ´Ï´Ù.
NULL;
¿¹¸¦ µé¸é, ´ÙÀ½ÀÇ 2°³ÀÇ ÄÚµå´Â µ¿µîÇÕ´Ï´Ù.
BEGIN
y := x / 0;
EXCEPTION
WHEN division_by_zero THEN
NULL; -- ¿¡·¯¸¦ ¹«½ÃÇÑ´Ù
END;
BEGIN
y := x / 0;
EXCEPTION
WHEN division_by_zero THEN -- ¿¡·¯¸¦ ¹«½ÃÇÑ´Ù
END;
¾î´À ÂÊÀÌ ¹Ù¶÷Á÷ÇÏ´Ù°í »ý°¢ÇÒÁö´Â, ±âÈ£ÀÇ ¹®Á¦ÀÔ´Ï´Ù.
Note: OracleÀÇ PL/SQL¿¡¼´Â, ºó ¸í·É¹®Àº Çã¿ëµÇÁö ¾Ê±â ¶§¹®¿¡ NULLÄõ¸® Çʼö °¡ µË´Ï´Ù. °Å±â¿¡ ¹ÝÇØ PL/pgSQL¿¡¼´Â, ºó ¸í·É¹®ÀÌ Çã¿ëµÇ°í ÀÖ½À´Ï´Ù.
PL/pgSQLÇÔ¼öÀÇ ³»ºÎ¿¡¼, µ¿Àû ¸í·É¹®, Áï, ½ÇÇàÇÒ ¶§¿¡ ´Ù¸¥ Å×À̺íÀ̳ª ´Ù¸¥ µ¥ÀÌÅÍÇüÀ» »ç¿ëÇÏ´Â ¸í·É¹®À» °®°í ½ÍÀº ÀÏÀÌ ÀÚÁÖ ÀÖ°ÚÁö¿ä. PL/pgSQL°¡ Åë»ó ½Ç½ÃÇÏ´Â ¸í·É¹® °èȹÀÇ Ä³½¬´Â ÀÌ·¯ÇÑ »óȲ¿¡¼´Â ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ·± Á¾·ùÀÇ ¹®Á¦¸¦ Ãë±ÞÇϱâ À§Çؼ, ÀÌÇÏÀÇ EXECUTE¹®ÀÌ ÁغñµÇ¾î ÀÖ½À´Ï´Ù.
EXECUTE
command-string
[ INTO [STRICT]
target
];
¿©±â¼, command-string ´Â ½ÇÇàµÇ´Â ¸í·ÉÀ» Æ÷ÇÔÇÑ(textÇüÀÇ) ¹®ÀÚ¿¿¡ µû¸¥ Æò°¡½Ä¿¡¼, target ´Â ·¹ÄÚµå º¯¼ö, Çà º¯¼ö, ȤÀº, ´Ü¼øÇÑ º¯¼ö¿Í ·¹ÄÚµå/Çà º¯¼öÀÇ Çʵ带 Äĸ¶·Î ´Ü¶ôÁöÀº ¸®½ºÆ®ÀÔ´Ï´Ù.
ƯÈ÷, PL/pgSQLº¯¼ö°¡ ÀÌ ¿¬»ê¿ëÀÇ ¹®ÀÚ¿ ¶óÀο¡ ġȯµÇÁö ¾Ê´Â °ÍÀ» ÁÖÀÇÇØÁÖ¼¼¿ä. ¾î´À º¯¼öÀÇ °ªµµ, ¸í·É¹® ¹®ÀÚ¿À» ÀÛ¼ºÇÒ ¶§¿¡ ¹°¾î¾ßÇÕ´Ï´Ù.
¶Ç, EXECUTE¿¡ ´ëÇØ¼ ½ÇÇàµÇ´Â ¸í·É¹®ÀÇ °èȹÀ» ij½¬ÇÒ °ÍÀº ¾ø½À´Ï´Ù. ´ë½Å¿¡, ¸í·ÉÀº ¸í·É¹®ÀÌ ½ÇÇàµÉ ¶§¿¡ ÁغñµË´Ï´Ù. µû¶ó¼, ´Ù¸¥ Å×À̺í°ú ¿¿¡ ´ëÇÑ Á¶ÀÛÀ» ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï, ¸í·É¹® ¹®ÀÚ¿À» ÇÔ¼ö ³»ºÎ¿¡¼ µ¿ÀûÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
INTO±¸´Â, ÇàÀ» µ¹·ÁÁÖ´Â SQL ¸í·ÉÀÇ °á°ú¸¦ ´ëÀÔÇØ¾ß ÇÒ Àå¼Ò¸¦ ÁöÁ¤ÇÕ´Ï´Ù. Çà ¶Ç´Â º¯¼ö ¸®½ºÆ®°¡ ÀÌ¿ëµÉ ¶§, ±×°ÍÀº Äõ¸®ÀÇ °á°úÀÇ ±¸Á¶¿Í Á¤È®ÇÏ°Ô ÀÏÄ¡ÇØ¾ß ÇÕ´Ï´Ù. (·¹ÄÚµå º¯¼ö°¡ »ç¿ëµÉ ¶§, ±×°ÍÀº ÀÚ±â ÀÚ½ÅÀ» °á°úÀÇ ±¸Á¶¿Í ÀÚµ¿ÀûÀ¸·Î ÀÏÄ¡½Ãŵ´Ï´Ù). º¹¼öÀÇ ÇàÀÌ µ¹·ÁÁÖ¾îÁ³À» ¶§, ÃÖÃÊÀÇ ÇุÀÌ INTOº¯¼ö¿¡ ´ëÀԵ˴ϴÙ. 1Ç൵ µ¹·ÁÁÖ¾îÁöÁö ¾ÊÀ» ¶§, NULL°¡ INTOº¯¼ö¿¡ ´ëÀԵ˴ϴÙ. INTO±¸°¡ ÁöÁ¤µÇÁö ¾ÊÀ» ¶§, Äõ¸®ÀÇ °á°ú´Â ¹ö·ÁÁý´Ï´Ù.
STRICT¿É¼ÇÀÌ ÁöÁ¤µÇ¾úÀ» ¶§, Äõ¸®ÀÇ °á°ú°¡ Á¤È®ÇÏ°Ô 1ÇàÀÇ °æ¿ì¸¦ Á¦¿ÜÇϰí´Â, ¿¡·¯°¡ µË´Ï´Ù.
SELECT INTO´Â EXECUTE¿¡¼´Â ÇöÀç Áö¿øµÇÁö ¾Ê½À´Ï´Ù.
µ¿Àû ¸í·ÉÀ» ½ÇÇàÇÒ ¶§, PL/pgSQL¿¡¼´Â ´ÜÀÏ ÀοëºÎÈ£¸¦ ȸÇÇÇØ¾ßÇÕ´Ï´Ù. Ãßõ µÇ´Â ¹æ¹ýÀº, ÇÔ¼ö º»¹®ÀÇ °íÁ¤µÈ ÅØ½ºÆ®¸¦ ´Þ·¯ ÀοëºÎÈ£·Î µÑ·¯½Î´Â ¹æ¹ýÀÔ´Ï´Ù (´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÏÁö ¾Ê´Â ±¸½ÄÀÇ Äڵ带 º¸À¯Çϰí ÀÖ´Â °æ¿ì´Â, Section 37.2.1ÀÇ °³¿ä¸¦ ÂüÁ¶ÇÏ´Â °ÍÀÌ, ÀÌÇØÇϱ⠽¬¿î Äڵ忡ÀÇ º¯È¯ ÀÛ¾÷ÀÇ µµ¿òÀÌ µË´Ï´Ù).
ÀÛ¼ºÇÑ Äõ¸®¿¡ »ðÀÔÇØ¾ß ÇÒ µ¿ÀûÀÎ °ªÀº, ±×°Í ÀÚ½ÅÀÇ ³»ºÎ¿¡ ÀοëºÎÈ£¸¦ Æ÷ÇÔÇÒ °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡, ÁÖÀÇ ±íÀº 󸮰¡ ÇÊ¿äÇÕ´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù(¿©±â¿¡¼´Â ÇÔ¼ö¿¡ ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» °¡Á¤Çϰí ÀÖÀ¸¹Ç·Î, ÀοëºÎÈ£¸¦ ÀÌÁßÈÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù).
EXECUTE 'UPDATE tbl SET '
|| quote_ident(colname)
|| ' = '
|| quote_literal(newvalue)
|| ' WHERE key = '
|| quote_literal(keyvalue);
ÀÌ ¿¹´Â, quote_ident¿Í quote_literalÇÔ¼öÀÇ »ç¿ë ¹æ¹ýÀ» ³ªÅ¸³»°í ÀÖ½À´Ï´Ù.
¾ÈÀüÀ» À§ÇØ, ¿°ú Å×À̺íÀÇ ½Äº°ÀÚ¸¦ Æ÷ÇÔÇÏ´Â ½ÄÀº quote_identÇÔ¼ö¸¦ ÅëÇØ¾ß ÇÕ´Ï´Ù.
µ¿ÀûÀ¸·Î ±¸ÃàµÇ´Â ¸í·É³»¿¡¼, ¸®ÅÍ·² ¹®ÀÚ¿ÀÌ µÇ¾î¾ß ÇÒ °ªÀ» Æ÷ÇÔÇÏ´Â ½ÄÀº quote_literalÇÔ¼ö¸¦ ÅëÇØ¾ßÇÕ´Ï´Ù.
¾çÂÊ ¸ðµÎ, ÀûÀýÇÑ Ã³¸®¸¦ ½Ç½ÃÇØ, ÀÔ·ÂµÈ ÅØ½ºÆ®¸¦ ´ÜÀÏ ÀοëºÎÈ£ ȤÀº ÀÌÁß ÀοëºÎÈ£·Î °ý, Ư¼ö ¹®ÀÚ¸¦ ¸ðµÎ ÀûÀýÈ÷ ȸÇÇÇØ ³¢¿ö³ÖÀº °ÍÀ» µ¹·ÁÁÝ´Ï´Ù.
´Þ·¯ ÀοëºÎÈ£ÀÇ ¿ë¹ýÀº ÀÏÁ¤ÇÑ ÅØ½ºÆ®¸¦ µÑ·¯½Ò ¶§¸¸ À¯¿ëÇÑ °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. À§ÀÇ ¿¹¸¦ ´ÙÀ½°ú °°ÀÌ ÇÏ´Â °ÍÀº, ¸Å¿ì ³ª»Û »ý°¢ÀÔ´Ï´Ù.
EXECUTE 'UPDATE tbl SET '
|| quote_ident(colname)
|| ' = $$'
|| newvalue
|| '$$ WHERE key = '
|| quote_literal(keyvalue);
¿Ö³ÄÇϸé, newvalueÀÇ ³»¿ëÀÌ ¿ì¿¬È÷ $$¸¦ Æ÷ÇÔÇÒ ¶§´Â, µµÁß¿¡ ´ÙÀ½ÀÇ Ã³¸®¿¡ ¿Å°ÜÁö±â ¶§¹®ÀÔ´Ï´Ù.
°°Àº ºÒÃø »çÅ´Â, ´Þ·¯ ÀοëºÎÈ£ÀÇ ´Ù¸¥ ´Ü¶ô ¹®ÀÚ¸¦ ¼±ÅÃÇßÀ» ¶§µµ ÀϾ´Ï´Ù.
µû¶ó¼, ÅØ½ºÆ®ÀÇ ³»¿ëÀÌ ±âÁ¸ÀÌ ¾Æ´Ò ¶§´Â, ¾ÈÀüÀ» À§Çؼ quote_literalÇÔ¼ö¸¦ »ç¿ë
ÇØ¾ß ÇÕ´Ï´Ù
.
µ¿Àû Äõ¸®¿Í EXECUTEÀÇ Àå´ëÇÑ ¿¹´Â Example 37-6À¸·Î º¼ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×°ÍÀº »õ·Î¿î ÇÔ¼ö¸¦ Á¤ÀÇÇϱâ À§Çؼ CREATE FUNCTION¸í·ÉÀ» ÀÌ¿ëÇØ ½ÇÇàÇÏ´Â °ÍÀÔ´Ï´Ù.
¸í·ÉÀÇ È¿°ú¸¦ ÆÇ´ÜÇÏ·Á¸é, ¸î °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ù¹øÂ° ¹æ¹ýÀº, ÀÌÇÏ¿Í °°Àº Çü½ÄÀÇ GET DIAGNOSTICS¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù.
GET DIAGNOSTICS
variable
=
item
[ , ... ];
ÀÌ ¸í·É¿¡ ÀÇÇØ, ½Ã½ºÅÛ »óÅ Áö½ÃÀÚ¸¦ ²¨³¾ ¼ö°¡ ÀÖ½À´Ï´Ù. °¢ item ´Â, ÁöÁ¤µÈ º¯¼ö¿¡ ÇÒ´çÇÒ ¼ö ÀÖ¾ú´ø »óŰªÀ» ½Äº°Çϱâ À§ÇÑ Å°¿öµåÀÔ´Ï´Ù (À̰ÍÀº ¹Þ±â À§Çؼ(¶§¹®¿¡) ¿Ã¹Ù¸¥ µ¥ÀÌÅÍÇüÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù). ÇöÀç »ç¿ë °¡´ÉÇÑ »óÅ Ç׸ñÀº, ROW_COUNT, RESULT_OIDÀÇ 2°³ÀÔ´Ï´Ù. ROW_COUNT´Â, ¸¶Áö¸·¿¡ SQL¿£Áø¿¡ ¼Û½ÅµÈ SQL¸í·É¿¡ ÀÇÇØ ó¸®µÈ Çà¼ö¸¦ ³ªÅ¸³À´Ï´Ù. RESULT_OID´Â, °¡Àå ÃÖ±ÙÀÇ SQL¸í·É¿¡ ÀÇÇØ »ðÀÔµÈ ¸¶Áö¸· ÇàÀÇ OIDÀÔ´Ï´Ù. RESULT_OID´Â OID¸¦ Æ÷ÇÔÇÏ´Â Å×ÀÌºí¿¡ INSERT¸í·É ÈÄ¿¡ À¯¿ëÇÑ °ÍÀ» ÁÖÀÇÇØ ÁÖ¼¼¿ä.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
GET DIAGNOSTICS integer_var = ROW_COUNT;
2¹øÂ°ÀÇ ¸í·ÉÀÇ È¿°ú¸¦ ÆÇ´ÜÇÏ´Â ¹æ¹ýÀº, FOUND¶ó´Â booleanÇüÀÇ Æ¯¼öÇÑ º¯¼ö¸¦ üũÇÏ´Â °ÍÀÔ´Ï´Ù. PL/pgSQLÀÇ °¢ ÇÔ¼ö³»¿¡¼ »ç¿ëµÉ ¶§, FOUND´Â óÀ½¿£ °ÅÁþÀ¸·Î ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù. ÀÌÇÏ¿Í °°ÀÌ, °¢°¢ÀÇ ¸í·É¹®ÀÇ Á¾·ù¿¡ ÀÇÇØ ¼³Á¤ÀÌ º¯°æµË´Ï´Ù.
SELECT INTO¹®Àº, ÇàÀÌ ´ëÀԵǾúÀ» °æ¿ì´Â Âü, µ¹·ÁÁÖ¾îÁöÁö ¾Ê¾Ò´ø °æ¿ì´Â °ÅÁþÀ» FOUND·Î ¼³Á¤ÇÕ´Ï´Ù.
PERFORM¹®Àº, ÇàÀÌ »ý¼º(ÆÄ±â)µÇ¾úÀ» °æ¿ì´Â Âü, »ý¼ºµÇÁö ¾Ê¾Ò´ø °æ¿ì´Â °ÅÁþÀ» FOUND·Î ¼³Á¤ÇÕ´Ï´Ù.
UPDATE, INSERT, ¹× DELETE¹®Àº, Àû¾îµµ 1ÇàÀÌ ¿µÇâÀ» ¹Þ¾ÒÀ» °æ¿ì´Â Âü, ÀüÇô ¿µÇâÀ» ¹ÞÁö ¾Ê¾Ò´ø °æ¿ì´Â °ÅÁþÀ» FOUND·Î ¼³Á¤ÇÕ´Ï´Ù.
FETCH¹®Àº, ÇàÀÌ µ¹·ÁÁÖ¾îÁ³À» °æ¿ì´Â Âü, ÀüÇô µ¹·ÁÁÖ¾îÁöÁö ¾Ê¾Ò´ø °æ¿ì´Â °ÅÁþÀ» FOUND·Î ¼³Á¤ÇÕ´Ï´Ù.
FOR¹®Àº 1ȸÀÌ»ó ¹Ýº¹À» ÇßÀ» °æ¿ì´Â Áø, ÇàÇØÁöÁö ¾Ê¾Ò´ø °æ¿ì´Â °ÅÁþÀ» FOUND·Î ¼³Á¤ÇÕ´Ï´Ù. À̰ÍÀº 3Á¾ÀÇ FOR¹® ¸ðµÎ(Á¤¼öFOR·çÇÁ, ·¹ÄÚµå ¼¼Æ®FOR·çÇÁ, µ¿Àû ·¹ÄÚµå ¼¼Æ®FOR·çÇÁ)¿¡ Àû¿ëÇÕ´Ï´Ù. FOUND´Â FOR·çÇÁ°¡ Á¾·áÇßÀ» ¶§, ÀÌ¿Í °°ÀÌ ¼³Á¤µË´Ï´Ù. Áï, ½ÇÇà ·çÇÁ³»¿¡¼´Â FOR¹®¿¡ ÀÇÇØ FOUND°¡ º¯°æµÇÁö ¾Ê½À´Ï´Ù. ´Ù¸¸, ·çÇÁ º»¹® ³»ÀÇ Å¸Á¾·ùÀÇ ¸í·É¹®À» ½ÇÇàÇÏ´Â °Í¿¡ ÀÇÇØ, º¯°æµÉÁöµµ ¸ð¸¨´Ï´Ù.
FOUND´Â °¢°¢ÀÇ PL/pgSQLÇÔ¼ö ³»ºÎÀÇ ·ÎÄà º¯¼öÀÔ´Ï´Ù. FOUND¿¡ ´ëÇØ¼ ÇàÇØÁø ¸ðµç º¯°æÀº, ÇöÀçÀÇ ÇÔ¼ö¿¡¸¸ ¿µÇâÀ» ÁÝ´Ï´Ù.