38.2. PL/Tcl ÇÔ¼ö¿Í ÀÎÀÚ

PL/Tcl¾ð¾î·Î ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ·Á¸é , ÀÌÇÏÀÇ Ç¥ÁØÀûÀÎ CREATE FUNCTION ±¸¹®À» »ç¿ëÇØ ÁÖ¼¼¿ä.

CREATE FUNCTION 
funcname
 (
argument-types
) RETURNS

return-type
 AS $$
# PL/Tcl ÇÔ¼ö º»Ã¼
$$ LANGUAGE pltcl;

PL/TclU¿¡¼­µµ, ¾ð¾î¿¡ pltclu¸¦ ÁöÁ¤ÇØ¾ß ÇÏ´Â Á¡ Àܴ̿ °°½À´Ï´Ù.

ÇÔ¼ö º»Ã¼´Â, ´Ü¼øÇÑ ÀÛÀº Tcl ½ºÅ©¸³Æ®ÀÔ´Ï´Ù. ÇÔ¼ö°¡ ºÒ·Á °¬À» ¶§, ÀÎÀÚÀÇ °ªÀº Tcl ½ºÅ©¸³Æ®¿¡ $1 ... $ n ¶ó°í ÇÏ´Â º¯¼ö·Î °Ç³×¹Þ½À´Ï´Ù. °á°ú´Â Åë»ó ´ë·Î return¹®À» »ç¿ëÇØ TclÀÇ ÄÚµå·ÎºÎÅÍ µ¹·ÁÁÖ¾îÁý´Ï´Ù.

¿¹¸¦ µé¸é, 2°³ÀÇ Á¤¼öÀÇ ´õ Å« ÆíÀ» µ¹·ÁÁÖ´Â ÇÔ¼ö´Â ÀÌÇÏ¿Í °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl STRICT;

STRICT±¸¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä. À̰Ϳ¡ ÀÇÇØ ÇÁ·Î±×·¡¸Ó´Â, ÀԷ¿¡ NULL°ªÀÌ ÁÖ¾îÁ³À» °æ¿ì¸¦ °ËÅäÇÏ´Â °ÍÀ» »ý·«ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. NULL°ªÀ» °Ç³×¹Þ¾ÒÀ» °æ¿ì, ÇÔ¼ö´Â ÀüÇô ºÒ·Á °¡Áö ¾Ê°í ´ÜÁö NULLÀ̶ó°í ÇÏ´Â °á°ú°¡ ÀÚµ¿ÀûÀ¸·Î µ¹·ÁÁÖ¾îÁý´Ï´Ù.

¾ö¹ÐÇÏÁö ¾ÊÀº ÇÔ¼ö¿¡¼­´Â ÀÎÀÚÀÇ ½ÇÁ¦ÀÇ °ªÀÌ NULLÀÎ °æ¿ì, ´ëÀÀÇÏ´Â $ n º¯¼ö´Â °ø¹®ÀÚ¿­·Î ¼³Á¤µË´Ï´Ù. ¾î´À ÀÎÀÚ°¡ NULLÀΰ¡ ¾Æ´Ñ°¡¸¦ °ËÃâÇϱâ À§Çؼ­´Â, argisnullÇÔ¼ö¸¦ »ç¿ëÇØ ÁÖ¼¼¿ä. ¿¹¸¦ µé¸é, ÀÎÀÚÀÇ ´Ù¸¥ ÇÑÂÊÀÌ NULL°ªÀÌ°í ´Ù¸¥ ÇÑÂÊÀÌ ºñNULL°ªÀÏ °æ¿ì, NULL°ª ¾Æ´Ñ ºñNULLÀÇ ÀÎÀÚÀÇ ÆíÀ» µ¹·ÁÁÖ´Â tcl_max¸¦ »ý°¢Çϸé ÀÌÇÏ¿Í °°ÀÌ µË´Ï´Ù.

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {[argisnull 1]} {
        if {[argisnull 2]} { return_null }
        return $2
    }
    if {[argisnull 2]} { return $1 }
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl;

À§¿¡¼­ °¡¸®Å² ´ë·Î, NULL°ªÀ» PL/Tcl ÇÔ¼ö·ÎºÎÅÍ µ¹·ÁÁÖ±â À§Çؼ­´Â return_null¸¦ ½ÇÇàÇØ ÁÖ¼¼¿ä. À̰ÍÀº, ÇÔ¼ö°¡ ¾ö¹ÐÇÑÁö¿¡ °ü°è¾øÀÌ, ½ÇÇàÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

º¹ÇÕÇüÀÇ ÀÎÀÚ´Â, Tcl ¹è¿­·Î¼­ ÇÔ¼ö¿¡°Ô °Ç³×Áý´Ï´Ù. ¹è¿­ÀÇ ¿ä¼Ò¸íÀº º¹ÇÕÇüÀÇ ¼Ó¼º¸íÀÔ´Ï´Ù. °Ç³×¹ÞÀº ÇàÀÇ ¼Ó¼ºÀÌ NULL°ªÀÎ °æ¿ì, ±× ¼Ó¼ºÀº ¹è¿­³»¿¡´Â ³ªÅ¸³ªÁö ¾Ê½À´Ï´Ù. ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

CREATE TABLE employee (
    name text,
    salary integer,
    age integer
);

CREATE FUNCTION overpaid(employee) RETURNS boolean AS $$
    if {200000.0 < $1(salary)} {
        return "t"
    }
    if {$1(age) < 30 && 100000.0 < $1(salary)} {
        return "t"
    }
    return "f"
$$ LANGUAGE pltcl;

ÇöÀç, º¹ÇÕÇüÀÇ ¹Ýȯ°ªÀ» µ¹·ÁÁÖ´Â ±â´ÉÀ̳ª ÁýÇÕÀ» µ¹·ÁÁÖ´Â ±â´ÉÀº Áö¿øµÇ°í ÀÖÁö ¾Ê½À´Ï´Ù.

ÇöÀç PL/Tcl´Â µµ¸ÞÀÎÇüÀ» ¿ÏÀüÇÏ°Ô Áö¿øÇϰí ÀÖ½À´Ï´Ù. µµ¸ÞÀÎÀ» ±× ¹èÈÄ¿¡ ÀÖ´Â ½ºÄ®¶óÇü°ú °°°Ô Ãë±ÞÇÕ´Ï´Ù. À̰ÍÀº, µµ¸ÞÀο¡ °ü·ÃÇÏ´Â Á¦¾àÀÌ ½ÃÇàµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ÀǹÌÇϰí ÀÖ½À´Ï´Ù. À̰ÍÀº ÇÔ¼öÀÇ ÀÎÀÚ¿¡¼­´Â ¹®Á¦ ¾ø½À´Ï´Ù¸¸, PL/TclÇÔ¼ö¸¦ µµ¸ÞÀÎÇüÀ¸·Î µ¹·ÁÁÖµµ·Ï ¼±¾ðÇßÀ» °æ¿ì´Â À§ÇèÇÕ´Ï´Ù.