| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 37. PL/pgSQL - SQL¼ö¼Ó ¾ð¾î | Fast Forward | Next |
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°¡ ÀÌ·¯ÇÑ ÅøÀÇ ÀÏ·ÊÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÅøÀº, ´ÜÀÏ ÀοëºÎÈ£¸¦ ȸÇǽÃŰ°Å³ª ´õ ½¬¿î ÇÔ¼ö¸¦ ¸¸µé°Å³ª µð¹ö±×¸¦ ¿ëÀÌÇÏ°Ô ½Ç½ÃÇÏ´Â Æí¸®ÇÑ ±â´ÉÀ» ÀÚÁÖ Á¦°øÇÕ´Ï´Ù.
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$¿Í °°Àº ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌÇÏÀÇ µÍÇ¥´Â ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÏÁö ¾ÊÀ» ¶§ÀÇ ÀοëºÎÈ£ÀÇ ±â¼ú¹ýÀ» ³ªÅ¸³½ °ÍÀÔ´Ï´Ù. ´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇϱâ ÀÌÀüÀÇ ÀοëºÎÈ£ÀÇ ±â¼úÀ» ÀÌÇØÇϴµ¥, ÀÌ µµÇ¥°¡ µµ¿òÀÌ µÈ´Ù°í »ý°¢µË´Ï´Ù.
ÇÔ¼ö º»¹®ÀÇ ¼±µÎ¿Í ¸»¹Ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
CREATE FUNCTION foo() RETURNS integer AS '
....
' LANGUAGE plpgsql;
ÇÔ¼ö º»¹® ³»ºÎ¿¡¼, ÀοëºÎÈ£´Â ¹Ýµå½Ã ½ÖÀ¸·Î ³ªÅ¸³³´Ï´Ù.
ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿ ¸®ÅÍ·²¿ë. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
a_output := ''Blah''; SELECT * FROM users WHERE f_name=''foobar'';
´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ ±â¼úÇÕ´Ï´Ù.
a_output := 'Blah'; SELECT * FROM users WHERE f_name='foobar';
¾î´À ÂÊÀ̳ª, PL/pgSQLÆÄ¼´Â °°Àº °æ¿ì°¡ µË´Ï´Ù.
ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿ ¸®ÅÍ·²³»ÀÇ ´ÜÀÏ ÀοëºÎÈ£°¡ ÀÖ´Â °æ¿ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
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$$
µ¡ºÙÀÎ ´Þ·¯ ÀοëºÎÈ£ÀÇ ´Ü¶ô ¹®ÀÚ´Â $$¸¸À̶ó°í´Â ÇÒ ¼ö ¾ø´Â °Í¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.
ÇÔ¼ö º»¹® ³»ºÎÀÇ ¹®ÀÚ¿ ³»ÀÇ ´ÜÀÏ ÀοëºÎÈ£°¡, ¹®ÀÚ¿ Á¤¼öÀÇ ¸»¹Ì¿¡ ÀÖ´Â °æ¿ì. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
a_output := a_output || '' AND name LIKE ''''foobar''''''
½ÇÁ¦·Î a_output¿¡ Ãß°¡µÇ´Â °ªÀº, AND name LIKE 'foobar'ÀÔ´Ï´Ù.
´Þ·¯ ÀοëºÎÈ£¸¦ ÀÌ¿ëÇÒ ¶§´Â, ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.
a_output := a_output || $$ AND name LIKE 'foobar'$$
¹®ÀÚ¿ Á¤¼ö³»¿¡ 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³»ºÎ¿¡¼¸¸ ÇÊ¿äÇÏ´Ù°í °¡Á¤ÇÕ´Ï´Ù.