37.2. PL/pgSQL¿¡ ÀÇÇÑ °³¹ß Á¶¾ð

PL/pgSQL·Î °³¹ßÇÏ´Â 1°³°¡ ÁÁÀº ¹æ¹ýÀº, ÇÔ¼ö¸¦ ÀÛ¼ºÇϴµ¥ ÀÚ½ÅÀÌ ÁÁ¾ÆÇÏ´Â ÅØ½ºÆ® ¹®ÀÚ ÆíÁý±â¸¦ »ç¿ëÇØ, 1°³ÀÇ À©µµ¿ì·Î psql¸¦ »ç¿ëÇØ ÇÔ¼ö¸¦ Àоîµé¿© Å×½ºÆ®¸¦ ½Ç½ÃÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î ½Ç½ÃÇÏ´Â °æ¿ì¿¡´Â CREATE OR REPLACE FUNCTION¸¦ »ç¿ëÇØ ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î ÆÄÀÏÀ» ´Ù½Ã ·ÎµåÇϰí, ÇÔ¼ö Á¤ÀǸ¦ °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $$
          ....
$$ LANGUAGE plpgsql;

psql¸¦ ½ÇÇàÇØ, ÀÌÇÏ¿Í °°ÀÌ ÇÔ¼ö Á¤ÀÇ ÆÄÀÏÀ» ·ÎµåÇϰųª, ¶Ç´Â ´Ù½Ã·Îµå ÇÒ ¼ö ÀÖ½À´Ï´Ù.

\i filename.sql

±× ÈÄ °ð¹Ù·Î, ÇÔ¼ö¸¦ Å×½ºÆ®Çϱâ À§Çؼ­ SQL ¸í·ÉÀ» ¹ßÇàÇÒ ¼ö ÀÖ½À´Ï´Ù.

PL/pgSQL¿¡¼­ÀÇ ¶Ç ´Ù¸¥ ÁÁÀº °³¹ß ¹æ¹ýÀº, ¼ö¼Ó ¾ð¾îÀÇ °³¹ß ±â´ÉÀ» °¡Áö´Â GUI µ¥ÀÌÅͺ£À̽º Á¢±Ù ÅøÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ±× ¹Û¿¡µµ ÀÖ½À´Ï´Ù¸¸, pgAdmin°¡ ÀÌ·¯ÇÑ ÅøÀÇ ÀÏ·ÊÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÅøÀº, ´ÜÀÏ ÀοëºÎÈ£¸¦ ȸÇǽÃŰ°Å³ª ´õ ½¬¿î ÇÔ¼ö¸¦ ¸¸µé°Å³ª µð¹ö±×¸¦ ¿ëÀÌÇÏ°Ô ½Ç½ÃÇÏ´Â Æí¸®ÇÑ ±â´ÉÀ» ÀÚÁÖ Á¦°øÇÕ´Ï´Ù.

37.2.1. ÀοëºÎÈ£ÀÇ Ãë±Þ

PL/pgSQLÇÔ¼öÀÇ ÄÚµå´Â CREATE FUNCTION³»¿¡¼­ ¹®ÀÚ¿­ ¸®ÅÍ·²·Î¼­ ÁöÁ¤µË´Ï´Ù. ´ÜÀÏ ÀοëºÎÈ£·Î µÑ·¯½Î´Â Åë»óÀÇ ¹æ½ÄÀ¸·Î ¹®ÀÚ¿­ ¸®ÅÍ·²À» ±â¼úÇÒ ¶§, ÇÔ¼ö º»Ã¼ ³»ºÎÀÇ ¸ðµç ´ÜÀÏ ÀοëºÎÈ£¸¦ ÀÌÁßÈ­ÇØ¾ßÇÕ´Ï´Ù. ÀÌ¿Í °°ÀÌ ¸ðµç backslash¸¦ ÀÌÁßÈ­ÇØ¾ß ÇÕ´Ï´Ù. µ¡ºÙ¿© ¹®ÀÚ¿­·Î¼­ ȸÇÇÇÏ´Â ±¸¹®ÀÌ »ç¿ëµÇ´Â °ÍÀ» °¡Á¤ÇÕ´Ï´Ù. ÀοëºÎÈ£¸¦ ´ÜÁö °ÅµìÇÏ´Â ¹æ½ÄÀº °¡Àå ÀåȲÇϰí, °£´ÜÇÏ°Ô »ó»óÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, º¹ÀâÇÑ »óÅ¿¡¼­´Â ¸î °³ ÀÌ»óÀÇ ÀÎÁ¢ÇÑ ÀοëºÎÈ£°¡ ÇÊ¿äÇϱ⠶§¹®¿¡, Äڵ带 ¼ÖÁ÷ÇÏ°Ô ÀÌÇØÇϱâ´Â ¾î·Á¿öÁý´Ï´Ù. ´ë½ÅÇØ Ãßõ µÇ´Â °ÍÀº, ÇÔ¼ö º»Ã¼¸¦ "´Þ·¯ ÀοëºÎÈ£"ÀÇ ¹®ÀÚ¿­ ¸®ÅÍ·²·Î¼­ ±â¼úÇÏ´Â °ÍÀÔ´Ï´Ù(Section 4.1.2.2¸¦ ºÁ ÁÖ¼¼¿ä). ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÏ´Â ¹æ½Ä¿¡¼­´Â ´Ù¸¥ ÀοëºÎÈ£¸¦ ÀÌÁßÈ­ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù¸¸, °¢°¢ÀÇ »óÀÚ°¡ µÈ °èÃþ¸¶´Ù ´Ù¸¥ ´Þ·¯ ÀοëºÎÈ£¿¡ ÀÇÇÑ ´Ü¶ô ºÎÈ£¸¦ ÀÌ¿ëÇØ¾ßÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, CREATE FUNCTION¸í·ÉÀ» ÀÌÇÏ¿Í °°ÀÌ ±â¼úÇØµµ »ó°ü¾ø½À´Ï´Ù.

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $PROC$
          ....
$PROC$ LANGUAGE plpgsql;

ÀÌ ¹æ½Ä¿¡¼­´Â, SQL ¸í·É Áß¿¡¼­ ´Ü¼øÇÑ ¸®ÅÍ·² ¹®ÀÚ¿­¿¡ ´ëÇØ¼­ ÀοëºÎÈ£¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ¹®ÀÚ¿­·Î¼­ Á¶¸³ÇÑ SQL ¸í·ÉÀÇ Á¶°¢À» ´Ü¶ôÁþ±â À§Çؼ­ $$¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à $$À» Æ÷ÇÔÇÑ ÅØ½ºÆ®¸¦ ÀοëºÎÈ£·Î Ç¥½ÃÇÒ ¶§´Â, $Q$¿Í °°Àº ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌÇÏÀÇ µÍÇ¥´Â ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÏÁö ¾ÊÀ» ¶§ÀÇ ÀοëºÎÈ£ÀÇ ±â¼ú¹ýÀ» ³ªÅ¸³½ °ÍÀÔ´Ï´Ù. ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇϱâ ÀÌÀüÀÇ ÀοëºÎÈ£ÀÇ ±â¼úÀ» ÀÌÇØÇϴµ¥, ÀÌ µµÇ¥°¡ µµ¿òÀÌ µÈ´Ù°í »ý°¢µË´Ï´Ù.

1°³ÀÇ ÀοëºÎÈ£

ÇÔ¼ö º»¹®ÀÇ ¼±µÎ¿Í ¸»¹Ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

CREATE FUNCTION foo() RETURNS integer AS '
          ....
' LANGUAGE plpgsql;

ÇÔ¼ö º»¹® ³»ºÎ¿¡¼­, ÀοëºÎÈ£´Â ¹Ýµå½Ã ½ÖÀ¸·Î ³ªÅ¸³³´Ï´Ù.

2°³ÀÇ ÀοëºÎÈ£

ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿­ ¸®ÅÍ·²¿ë. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ ±â¼úÇÕ´Ï´Ù.

a_output := 'Blah';
SELECT * FROM users WHERE f_name='foobar';

¾î´À ÂÊÀ̳ª, PL/pgSQLÆÄ¼­´Â °°Àº °æ¿ì°¡ µË´Ï´Ù.

4°³ÀÇ ÀοëºÎÈ£

ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿­ ¸®ÅÍ·²³»ÀÇ ´ÜÀÏ ÀοëºÎÈ£°¡ ÀÖ´Â °æ¿ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

½ÇÁ¦·Î a_output¿¡ Ãß°¡µÈ °ªÀº, AND name LIKE 'foobar' AND xyzÀÔ´Ï´Ù.

´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ ±â¼úÇÕ´Ï´Ù.

a_output := a_output || $$ AND name LIKE 'foobar' AND xyz$$

µ¡ºÙÀÎ ´Þ·¯ ÀοëºÎÈ£ÀÇ ´Ü¶ô ¹®ÀÚ´Â $$¸¸À̶ó°í´Â ÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.

6°³ÀÇ ÀοëºÎÈ£

ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿­ ³»ÀÇ ´ÜÀÏ ÀοëºÎÈ£°¡, ¹®ÀÚ¿­ Á¤¼öÀÇ ¸»¹Ì¿¡ ÀÖ´Â °æ¿ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

a_output := a_output || '' AND name LIKE ''''foobar''''''

½ÇÁ¦·Î a_output¿¡ Ãß°¡µÇ´Â °ªÀº, AND name LIKE 'foobar'ÀÔ´Ï´Ù.

´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.

a_output := a_output || $$ AND name LIKE 'foobar'$$

10°³ÀÇ ÀοëºÎÈ£

¹®ÀÚ¿­ Á¤¼ö³»¿¡ 2°³ÀÇ ´ÜÀÏ ÀοëºÎÈ£¸¦ °®°ÔÇÏ°í ½ÍÀº °æ¿ì(8°³ÀÇ ´ÜÀÏ ÀοëºÎÈ£°¡ µÇ´Â), ÇÑÆí, ÀÌ ¹®ÀÚ¿­ Á¤¼öÀÇ ¸»¹Ì¿¡ ÀÖ´Â °æ¿ì(2°³ Ãß°¡µË´Ï´Ù). ¾Æ¸¶, ´Ù¸¥ ÇÔ¼ö¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â °æ¿ì(Example 37-6)¿¡¸¸ À̰ÍÀÌ ÇÊ¿äÇÏ°Ô µÇ°ÚÁö¿ä. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

a_output := a_output || '' if v_'' || 
    referrer_keys.kind || '' like '''''''''' 
    || referrer_keys.key_string || '''''''''' 
    then return ''''''  || referrer_keys.referrer_type 
    || ''''''; end if;''; 

a_outputÀÇ °ªÀº ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

if v_... like ''...'' then return ''...''; end if;

´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.

a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
    || referrer_keys.key_string || $$'
    then return '$$  || referrer_keys.referrer_type 
    || $$'; end if;$$; 

¿©±â¼­ ´ÜÀÏ ÀοëºÎÈ£´Â »ç¿ëÀü¿¡ ÀçÆò°¡µÇ±â ¶§¹®¿¡, a_output³»ºÎ¿¡¼­¸¸ ÇÊ¿äÇÏ´Ù°í °¡Á¤ÇÕ´Ï´Ù.