40.3. µ¥ÀÌÅͺ£À̽º Á¢±Ù

PL/Python ¾ð¾î ¸ðµâÀº ÀÚµ¿ÀûÀ¸·Î plpy¶ó´Â Python ¸ðµâÀ» ÀÓÆ÷Æ® ÇÕ´Ï´Ù. ÀÌ ¸ðµâÀÇ ÇÔ¼ö¿Í Á¤¼ö´Â, plpy. foo ¿Í °°ÀÌ ÀÛ¼ºÇÑ Python ÄÚµå·ÎºÎÅÍ »ç¿ëÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ÇöÀç plpy¿¡¼­´Â, plpy.debug( msg ), plpy.log( msg ), plpy.info( msg ), plpy.notice( msg ), plpy.warning( msg ), plpy.error( msg ),¹× plpy.fatal( msg ) ÇÔ¼ö¸¦ ±¸ÇöÇϰí ÀÖ½À´Ï´Ù. plpy.error ¹× plpy.fatal´Â, ½ÇÁ¦·Î PythonÀÇ ¿¹¿Ü¸¦ ¹ß»ý½Ãŵ´Ï´Ù. À̰ÍÀÌ Æ÷ÂøµÇÁö ¾Ê´Â °æ¿ì, È£ÃâÁßÀÇ Äõ¸® ¿ÜºÎ¿¡ ÀüÇØÁ®, ±× °á°ú, ÇöÀçÀÇ Æ®·£Àè¼Ç ȤÀº ¼­ºêÆ®·£Àè¼ÇÀÌ Áß´Ü(abort) ÇÕ´Ï´Ù. raise plpy.ERROR("msg") ¹× raise plpy.FATAL("msg")´Â, °¢°¢ plpy.error ¹× plpy.fatalÀÇ È£Ãâ°ú °°½À´Ï´Ù. ´Ù¸¥ ·¹º§Àº, ´Ù¸¥ Á߿䵵ÀÇ ¸Þ¼¼Áö¸¦ »ý¼ºÇÒ »ÓÀÔ´Ï´Ù. log_min_messages °ú client_min_messages¼³Á¤ º¯¼ö´Â, ƯÁ¤ÀÇ Á߿䵵ÀÇ ¸Þ¼¼Áö¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡ º¸°íÇÏ´ÂÁö, ¼­¹öÀÇ ·Î±×¿¡ ½á³»´ÂÁö, ȤÀº ±× ¾çÂÊ ¸ðµÎ ÀÎÁö¸¦ Á¦¾îÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ °ÍÀº Chapter 17À» ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

°Ô´Ù°¡ plpy¸ðµâÀº execute ¹× prepare¶ó´Â 2°³ÀÇ ÇÔ¼ö¸¦ ÁغñÇϰí ÀÖ½À´Ï´Ù. plpy.execute¸¦, Äõ¸® ¹®ÀÚ¿­ ¹× »ý·« °¡´ÉÇÑ Á¦ÇÑ ÀÎÀÚ¸¦ ºÙ¿© È£ÃâÇϸé, Äõ¸®°¡ ½ÇÇàµÇ¾î °á°ú °´Ã¼·Î¼­ Äõ¸® °á°ú°¡ µ¹¾Æ°©´Ï´Ù. ÀÌ °á°ú °´Ã¼´Â ¸®½ºÆ® ȤÀº ÀÌÀü °´Ã¼¸¦ ¸ð¹æ ÇÕ´Ï´Ù. °á°ú °´Ã¼´Â, Çà ¹øÈ£³ª ·Ä¸íÀ» ÅëÇØ Á¢±Ù ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. °á°ú °´Ã¼¿¡´Â, Äõ¸® °á°úÀÇ Çà¼ö¸¦ µ¹·ÁÁÖ´Â nrows(), SPI_execute°¡ µ¹·ÁÁÖ´Â °ªÀ» µ¹·ÁÁÖ´Â, status¶ó´Â ¹æ¹ýÀÌ Ãß°¡µÇ°í ÀÖ½À´Ï´Ù. °á°ú °´Ã¼´Â º¯°æÀÌ °¡´ÉÇÕ´Ï´Ù.

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

rv = plpy.execute("SELECT * FROM my_table", 5)

À̰ÍÀº, my_table·ÎºÎÅÍ 5Çà±îÁö¸¦ µ¹·ÁÁÝ´Ï´Ù. my_table¿¡ my_column¿­ÀÌ Á¸ÀçÇÏ´Â °æ¿ì, ±× ¿­¿¡´Â ÀÌÇÏ¿Í °°ÀÌ Á¢±Ù ÇÒ ¼ö ÀÖ½À´Ï´Ù.

foo = rv[i]["my_column"]

2¹øÂ°ÀÇ ÇÔ¼ö plpy.prepare´Â, Äõ¸®ÀÇ ½ÇÇà °èȹÀ» ÁغñÇÕ´Ï´Ù. Äõ¸®³»¿¡ ¸Å°³º¯¼ö ÂüÁ¶°¡ ÀÖ´Â °æ¿ì, Äõ¸® ¹®ÀÚ¿­ ¹× ÀÎÀÚÇüÀÇ ¸®½ºÆ®¿Í ÇÔ²² ºÒ·Á °©´Ï´Ù. ¿¹¸¦ µé¸é, ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.

plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", [ "text" ])

text´Â, $1·Î¼­ °Ç³×ÁÖ´Â º¯¼öÀÇ ÇüÅÂÀÔ´Ï´Ù. ¸í·É¹®À» ÁغñÇÑ ÈÄ, ±×°ÍÀ» ½ÇÇàÇϱâ À§Çؼ­ ÇÔ¼öplpy.execute¸¦ »ç¿ëÇÕ´Ï´Ù.

rv = plpy.execute(plan, [ "name" ], 5)

3¹øÂ°ÀÇ ÀÎÀÚ´Â Á¦ÇÑ ÀÎÀÚÀ̸ç, »ý·« °¡´ÉÇÕ´Ï´Ù.

PL/Python ¸ðµâÀ» »ç¿ëÇØ ÁغñÇÑ °èȹÀº ÀÚµ¿ÀûÀ¸·Î º¸Á¸µË´Ï´Ù. À̰ÍÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö¿¡ ´ëÇØ¼­´Â SPIÀÇ ¹®¼­(Chapter 41)¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä. À̰ÍÀ» º¹¼ö È£Ãâ¿¡ ´ëÇØ È¿°úÀûÀ¸·Î »ç¿ëÇϱâ À§Çؼ­´Â, ¿µ¼ÓÀûÀÎ ÀúÀå¿ë »çÀüÀÎ SD ¶Ç´Â GD(Section 40.1¸¦ ÂüÁ¶)ÀÇ ¾î´ÀÂÊÀÌµç »ç¿ëÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¸é, ÀÌÇÏ¿Í °°ÀÌ ÇÕ´Ï´Ù.

CREATE FUNCTION usesavedplan() RETURNS trigger AS $$
    if SD.has_key("plan"):
        plan = SD["plan"]
    else:
        plan = plpy.prepare("SELECT 1")
        SD["plan"] = plan
    # rest of function
$$ LANGUAGE plpythonu;