Á¦ ¸ñ : [¹ø¿ª]Postgres95 User's Manual(1-10) ¿Ã¸°ÀÌ : ¿¥ºê¸®¿À(À¯Çü¸ñ ) 97/08/24 04:46 ÀÐÀ½ : 20 °ü·ÃÀÚ·á ¾øÀ½ ----------------------------------------------------------------------------- #61 À¯Çü¸ñ (Embryo ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (1) 08/16 22:08 141 line Á¦ ¸ñ : Postgres95 User Manual ¹ø ¿ª : À¯Çü¸ñ (1 -3 chapter) embryo@nownuri.net Çѵ¿ÈÆ (4-11 chapter) ddoch@home.hite.net ÀúÀÛ±Ç: GPLÀ» ÁؼöÇÏ¸ç »ó¾÷Àû ¸ñÀûÀ¸·Î ¾Ç¿ëÇÒ¼ö ¾øÀ½. The POSTGRES95 User Manual Version 1.0 (September 5, 1995) 1. ¼Ò°³ ÀÌ ¹®¼­´Â ¹öŬ¸® ¼ÒÀç Ķ¸®Æ÷´Ï¾Æ ´ëÇп¡¼­ °³¹ßµÈ postgres95 µ¥ÀÌÅÍ º£À̽º ½Ã½º ÅÛÀÇ »ç¿ëÀÚ ¼³¸í¼­ÀÌ´Ù. postgres95´Â postgres release 4.2¿¡ ±× ±â¹ÝÀ» µÎ°í ÀÖ ´Ù. postgres ÇÁ·ÎÁ§Æ®´Â Michale Stonebraker ±³¼ö¿¡ ÀÇÇØ ÁÖµµ µÇ¾úÀ¸¸ç, ´ÙÀ½°ú °°Àº ±â°üµéÀÇ ÈÄ¿øÀ» ¹Þ¾Ò´Ù. - DRAPA : Defence Advanced Research Projects Agency - ARO : Army Research Office - NSF : National Science Foundation (¹Ì ±¹¸³°úÇÐÀç´Ü) - ELS ±âŸ µîµî 1.1. postgres¶õ ¹«¾ùÀΰ¡? ÀüÅëÀûÀÎ µ¥ÀÌÅÍ º£À̽º ½Ã½ºÅÛµéÀº °ü°è¶ó´Â À̸§ÀÇ ÁýÇÕüÀÎ µ¥ÀÌÅÍ ¸ðµ¨À» Á¦°ø ÇÑ´Ù. ÀÌ°ÍÀº Ưº°ÇÑ Çü½ÄÀÇ ¼Ó¼ºÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÇöÀçÀÇ »ó¾÷¿ë ½Ã½ºÅÛ¿¡¼­´Â °í Á¤ ¼Ò¼öÁ¡ ¹æ½ÄÀÇ ¼öÄ¡, Á¤¼öÇü, ¹®ÀÚÇü, ±ÝÀüÇü, ³¯Â¥Çü µîÀÇ µ¥ÀÌÅÍÇüÀÌ °¡´ÉÇÏ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ µ¥ÀÌÅÍ ¸ðµ¨ µéÀº ¹Ì·¡ÀÇ µ¥ÀÌÅÍ Ã³¸® ÇÁ·Î±×·¥¿¡¼­´Â ºÒ ÃæºÐÇÑ °ÍÀ¸·Î ¿©°ÜÁö°í ÀÖ´Ù. °ü°èÇü µ¥ÀÌÅÍ ¸ðµ¨Àº ¼º°øÀûÀ¸·Î ±âÁ¸ÀÇ µ¥ÀÌÅÍ ¸ðµ¨µéÀ» ¹Ù²Ù¾î ³ª°¡°í Àִµ¥, ±× °ÍÀº ¾ö°ÝÇÑ ´Ü¼ø¼º ¶§¹®ÀÌ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ´Ü¼øÇÔÀÌ ¶§·Î´Â ¾î¶² ÇÁ·Î±×·¥À» ±¸Çö Çϴµ¥ À־´Â ¾î·Á¿òÀ¸·Î ÀÛ¿ëÇϱ⵵ ÇÑ´Ù. postgres ´Â »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀ» ½±°Ô È®Àå½Ãų¼ö ÀÖ´Â ´ÙÀ½ÀÇ ±âº»ÀûÀÎ ³× °¡Áö ±¸¼ºÀ» Á¦°øÇϸç, ÀÌ°ÍÀ» ÅëÇÏ¿© Çùµ¿ÇÔÀ¸ ·Î¼­ ÁøÁ¤ÇÑ À§·ÂÀ» ¹ßÈÖÇÏ°Ô µÈ´Ù. - classes(Ŭ·¡½º) - inheritance(»ó¼Ó¼º) - types(µ¥ÀÌÅÍÇü) - functions(ÇÔ¼ö) ºÎ°¡ÀûÀ¸·Î postgres´Â °­·ÂÇÑ rule ½Ã½ºÅÛÀ» Á¦°øÇÑ´Ù. ÁÖ) ------------------------------------------------------------------------ °³ÀÎÀûÀÎ »ý°¢À¸·Î´Â ÀÌ°ÍÀÌ ¹Ù·Î °´Ã¼ÁöÇâ µ¥ÀÌÅÍ º£À̽º¸¦ ÁöĪÇÏ´Â °ÍÀÌ ¾Æ´Ñ°¡ ÇÑ´Ù. Áï, °ú°Å¿¡´Â º°·Î ÇÊ¿äÇÏÁö ¾Ê¾Ò´ø ±×·¡ÇÈ µ¥ÀÌÅÍ È¤Àº »ç¿îµå µ¥ÀÌÅÍ, ȤÀº Áö¸®Á¤º¸¿¡ °üÇÑ µ¥ÀÌÅÍ, µîµîÀÇ »õ·Î¿î µ¥ÀÌÅÍ Çü½ÄÀ» ´Ù·ç´Âµ¥ À־ °´Ã¼ÁöÇâ µ¥ÀÌÅÍ º£À̽ºÀÇ Çʿ伺À» ¾Ï½Ã Çϸ鼭, ¾ÕÀ¸·Î µ¥ÀÌÅÍ º£À̽º¿¡ ÇÊ¿äÇÑ »õ·Î¿î ¾î¶² ¹æÇâ Á¦½Ã¸¦ ÇÏ°í ÀÖ´Â µí ÇÏ´Ù. 1.2 postgres ÇÁ·ÎÁ§Æ®¿¡ ´ëÇÑ °£´ÜÇÑ ¿ª»ç postgres DBMS´Â 1986³âºÎÅÍ ±¸ÇöµÇ±â ½ÃÀÛÇÏ¿´´Ù. ÀÌ ½Ã½ºÅÛ¿¡ ´ëÇÑ ÃÖÃÊÀÇ °³³äÀº [STON86] ¿¡¼­ Á¦½Ã µÇ¾úÀ¸¸ç, [ROWE87]¿¡¼­ µ¥ÀÌÅÍ ¸ðµ¨¿¡ ´ëÇÑ ÃÖÃÊÀÇ Á¤ÀÇ°¡ ³ªÅ¸ ³ª ÀÖ´Ù. rule ½Ã½ºÅÛ¿¡ ´ëÇÑ °³³äÀº [STON87a] ¿¡¼­ óÀ½ ±â¼úµÇ¾úÀ¸¸ç, µ¥ÀÌÅÍ Ã³ ¸®ºÎ¿¡ ´ëÇÑ ÀÌ·ÐÀû ±Ù°Å¿Í ¾ÆÅ°ÅØó¿¡ ´ëÇÑ ³»¿ëÀº [STON87b] ¿¡ »ó¼¼ÇÏ°Ô ±â¼úµÇ¾î ÀÖ´Ù. postgres´Â ¸î ¹øÀÇ ÁÖ¿äÇÑ ¹ßÇ¥¸¦ °ÅÃÆÀ¸¸ç, ù ¹ø° µ¥¸ð ÇÁ·Î±×·¥ÀÌ 1987³â¿¡ ó À½ µ¿ÀÛÇÏ°Ô µÇ¾ú°í, 1988³â¿¡ ACM-SIGMOD ȸÀÇ¿¡¼­ º¸¿©Áö°Ô µÇ¾ú´Ù. [STON90a] ¿¡ ¼­ ¾ð±ÞÇÏ°í ÀÖ´Â ¹öÀü1Àº 1989³â 6¿ù¿¡ ³»ºÎÀÇ ¸î ¸î »ç¿ëÀڵ鿡°Ô¸¸ ÇÑÁ¤ÀûÀ¸·Î ¹ß Ç¥µÇ¾ú´Ù. [STON89]¿¡¼­ ±¸ÇöµÈ ù ¹ø° rule ½Ã½ºÅÛÀÇ Æò°¡¿¡ ´ëÀÀÇÏ¿© [STON90b]¿¡ ¼­ »õ·Î µðÀÚÀÎ µÇ¾úÀ¸¸ç, 1990³â 6¿ù¿¡ »õ·Î¿î rule ½Ã½ºÅÛÀ» °¡Áø ¹öÀü 2°¡ ¹ßÇ¥µÇ ¾ú´Ù. 1991³âÀÇ ¹öÀü 3¿¡¼­´Â ´ÙÁß µ¥ÀÌÅÍ Ã³¸®ºÎ¿¡ ´ëÇÑ Áö¿ø°ú °³¼±µÈ ÁúÀÇ ½ÇÇà È­ÀÏ, ±×¸®°í »õ·Î ÀÛ¼ºµÈ rule ½Ã½ºÅÛÀÌ Ãß°¡ µÇ¾ú´Ù. postgres´Â ¼­·Î ´Ù¸£¸é¼­µµ ¸Å¿ì ¸¹Àº ¿¬±¸¿Í ÀÀ¿ëµÈ °á°ú µéÀ» ±¸Çö Çϴµ¥ »ç¿ëµÇ ¾îÁ® ¿ÔÀ¸¸ç ±× ³»¿ëµéÀ» »ìÆ캸¸é, ±ÝÀ¶»óÀÇ µ¥ÀÌÅÍ ºÐ¼® ½Ã½ºÅÛ, Á¦Æ® ¿£ÁøÀÇ ¼º´É À» ¸ð´ÏÅ͸µÇÏ´Â ÆÐÅ°Áö, ¼ÒÇ༺ÀÇ ¿îµ¿À» ÃßÀûÇÏ´Â µ¥ÀÌÅÍ º£À̽º, ÀÇÇÐ Á¤º¸ µ¥ÀÌ ÅÍ º£À̽º, ¸î °³ÀÇ Áö¸®Á¤º¸ ½Ã½ºÅÛ µî µîÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. postgres ´Â ¶ÇÇÑ ¿©·¯´ëÇп¡¼­ ±³À°¿ëÀ¸·Î ¾²¿©Á® ¿Ô´Ù. ¸¶Ä§³» Illustra Informat- on Technologies ¿¡¼­´Â ÀϺÎÀÇ Äڵ带 »ç¿ëÇÏ¿© ±×°ÍÀ» »ó¾÷È­ ÇÏ¿´´Ù. 1992³â¿¡ postgres´Â Sequoia 2000 scientific computing projectÀÇ ÁÖ¿äÇÑ µ¥ÀÌÅÍ Ã³¸®±â·Î ¼±Á¤µÇ¾ú´Ù. ³ª¾Æ°¡¼­ 1993³â¿¡´Â ³»ºÎ »ç¿ëÀÚÀÇ Áý´ÜÀÇ Å©±â°¡ µÎ¹è¿¡ °¡ ±î¿öÁ³´Ù. ÀÌ°ÍÀº ÄÚµåÀÇ ¿øÇüÀ» °ü¸®ÇÏ°í ±×°ÍÀ» Áö¿øÇÏ´Â ÀÏ¿¡ µ¥ÀÌÅÍ º£À̽º ¿¬±¸ Áß ´õ ¸¹Àº ½Ã°£ÀÌ ÇÒ´çµÇ¾î °¡°í ÀÖ´Ù´Â Á¡À» ¸í¹éÇÏ°Ô ¸»ÇØÁØ´Ù. ÀÌ·¯ÇÑ Èûµç ¼ö°í ¸¦ ÁÙÀ̱â À§Çؼ­ °ø½ÄÀûÀ¸·Î ÀÌ ÇÁ·ÎÁ§Æ®´Â ¹öÀü 4.2¸¦ ¸¶Áö¸·À¸·Î Á¾·áµÇ¾ú´Ù. ÁÖ) ------------------------------------------------------------------------- [ ] ¾ÈÀÇ ³»¿ëÀº postgres¸¦ ¿¬±¸Çϸ鼭 ¹ßÇ¥µÈ ³í¹®ÀÇ ¾àÀÚ¸¦ ¶æÇÑ´Ù. 1.3 postgres 95¶õ ¹«¾ùÀΰ¡? postgres 95´Â postgresÀÇ ¸¶Áö¸· °ø½Ä¹öÀüÀÎ 4.2 ·ÎºÎÅÍ ÆÄ»ýµÈ °ÍÀÌ´Ù. ÄÚµå´Â ÇöÀç ¿ÏÀüÈ÷ ANSI C ·Î ÀÛ¼ºµÇ¾úÀ¸¸ç, ÄÚµåÀÇ Å©±âµµ ¾à 25% °¡ ÁÙ¾ú°í, ¼º´É°³¼±°ú ÄÚµå À¯Áö ºÎºÐ¿¡ ´ëÇÑ ¸¹Àº ³»ºÎÀû º¯È­°¡ ÀÖ¾ú´Ù. postgres95´Â ¹öÀü 4.2¿Í ºñ±³ÇÒ ¶§ ¾à 30% - 50% Á¤µµÀÇ ºü¸¥ ½ÇÇà¼Óµµ¸¦ º¸ÀδÙ. ¹ö±×¼öÁ¤ ¹®Á¦¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö Áß ¿äÇÑ ¼º´É °³¼± »çÇ×Àº ´ÙÀ½°ú °°´Ù. - ÁúÀǾ postquel ¿¡¼­ ¼­¹ö»ó¿¡ ±¸ÇöµÈ SQL ·Î ±³Ã¼µÇ¾ú´Ù. ±×·¯³ª ¾ÆÁ÷Àº subq- ueries ¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù. (subqueries¿¡ ´ëÇÑ °ÍÀº »ç¿ëÀÚ Á¤ÀÇÇÔ¼ö·Î ºñ½Á ÇÑ È¿°ú¸¦ ³¾¼ö ÀÖ´Ù.) Aggregate(ÁýÇÔÇÔ¼ö)°¡ ´Ù½Ã ±¸ÇöµÇ¾úÀ¸¸ç, group by ¿¡ ´ëÇÑ Áö¿øÀÌ Ãß°¡ µÇ¾ú´Ù. LIBPQ ºÎºÐÀº ¾ÆÁ÷µµ C ¾ð¾î°¡ À¯È¿ÇÏ´Ù. - »õ·Î¿î ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥ÀÎ psql ÇÁ·Î±×·¥ÀÌ Ãß°¡ µÇ¾úÀ¸¸ç, GNU readlineÀ» Áö¿ø ÇÑ´Ù. - Tcl À» ±â¹ÝÀ¸·Î ÇÏ¿© µ¥ÀÌÅÍ º£À̽º¿ÍÀÇ ¿¬°áÇÒ ¼ö ÀÖ´Â »õ·Î¿î ¶ó¸®ºê·¯¸®·Î li- bpgtcl À» Ãß°¡ÇÏ¿´´Ù. »ùÇà ½©ÀÎ pgtclshÀº tcl ÇÁ·Î±×·¥À» °¡Áö°í postgres¿Í ¿¬ °áÇÒ¼ö ÀÖ´Â »õ·Î¿î Tcl ¸í·É¾î¸¦ Á¦°øÇÑ´Ù. - ´ë±Ô¸ð °´Ã¼ÀÇ ¿¬°á ¹æ¹ý¿¡¼­´Â öÀúÇÑ Á¶»ç°¡ ÀÖ¾ú´Ù. ´ë±Ô¸ð °´Ã¼ÀÇ º¯È¯Àº ´Ü Áö ´ë±Ô¸ð °´Ã¼¸¦ ÀúÀåÇÏ´Â ¹æ½Ä¿¡ ´ëÇÑ °Í¿¡¸¸ ¿ªÁ¡À» µÎ¾ú´Ù. ( ÀÌ¹Ì Á¦°ÅµÈ È­ ÀÏ ½Ã½ºÅÛÀÇ º¯È¯À¸·Î ÀÎÇÑ È¥µ¿ÀÌ ¾Æ´Ô¿¡ À¯ÀÇ ÇÒ°Í. ) - ¿¹Á¦¼öÁØÀÇ rule ½Ã½ºÅÛÀº Á¦°Å µÇ¾úÀ¸¸ç, »õ·Î ¾²¿©Áø rule ½Ã½ºÅÛÀº ¾ÆÁ÷µµ À¯È¿ ÇÏ´Ù. - ÀϹÝÀûÀÎ SQL ÀÌ ¹«¾ùÀÎÁö¸¦ ¼Ò°³Çϴ ª°í ±³À°ÀûÀÎ ¼Ò½º ÄÚµåµéÀ» °°ÀÌ ¹èÆ÷ÇÏ¿´ ´Ù. - ÇÁ·Î±×·¥À» »ý¼ºÇϴµ¥ À־ GNU make (BSD make ´ë½Å) °¡ »ç¿ëµÇ¾ú°í, ¶ÇÇÑ ¼ö Á¤µÇÁö ¾ÊÀº gcc ¿¡¼­ ÄÄÆÄÀÏ µÇ¾îÁú¼öµµ ÀÖ´Ù. (´õºí¿¡¼­ µ¥ÀÌÅÍ ¹è¿­ÀÌ ¼öÁ¤µÇ¾ú ´Ù.) 1.4 ÀÌ ¹èÆ÷ÆÇ¿¡ ´ëÇÏ¿© postgres´Â ¹«·áÀÌ´Ù. º» ¼³¸í¼­´Â Postgres95 ¹öÀü 1.0 ¿¡ ´ëÇÏ¿© ¼³¸íÇÏ°í ÀÖ´Ù. ÀúÀÚ´Â ´ÙÀ½°ú °°Àº Ç÷§Æû¿¡¼­ÄÄÆÄÀÏ°ú Å×½ºÆ®¸¦ °ÅÃÆ´Ù. +--------------------------+------------+------------------------------------+ | architecture | processor | Operation System | +--------------------------+------------+------------------------------------+ | DECstation 3000 | Alpha AX | OSF/1 2.1, 3.0, 3.2 | | DECstation 5000 | MIPS | ULTRIX 4.4 | | Sun4 | SPARC | SonOS 4.1.3, 4.1.3_U1,Solaris 2.4 | | HP - 9000/700 and 800 | PA-RISC | HP-UX 9.00 9.01 9.03 | | Intel | X86 | Linux 1.2.8 ELF | +--------------------------+------------+------------------------------------+ 1.5 ÀÌ ¼³¸í¼­ÀÇ °³¿ä. Áö±ÝºÎÅÍ Postgres´Â Postgres95¸¦ ÀǹÌÇÏ´Â ¶æÀ¸·Î ¾²ÀÏ°ÍÀ̸ç, ÀÌ ¼³¸í¼­ÀÇ Àü¹ÝºÎ ¿¡¼­´Â ½Ã½ºÅÛ¿¡ ´ëÇÑ ±âº»ÀûÀÌ °³³ä°ú Postgres ½Ã½ºÅÛÀ» ½ÃÀÛÇÏ´Â ÀýÂ÷¿¡ ´ëÇØ ¼³ ¸íÇÑ´Ù. ±×¸®°í ³ª¼­ PostgresÀÇ µ¥ÀÌÅÍ ¸ðµ¨°ú SQL ¿¡ ´ëÇؼ­ °³·«ÀûÀ¸·Î »ìÆ캸°í Á¶±ÝÀº ¼öÁØÀÌ ³ôÀº ºÎºÐ¿¡ ´ëÇؼ­µµ ¼³¸íÇϵµ·Ï ÇÑ´Ù. ´ÙÀ½À¸·Î »ç¿ëÀÚ Á¤ÀÇ ÇüÅÂÀÇ ¿¬»êÀÚ, ÁýÇÕ ÇÔ¼ö¸¦ Ãß°¡ÇÔÀ¸·Î½á, ¾î¶»°Ô Postgres¸¦ È®Àå½Ãų¼ö ÀÖ´ÂÁö, ±×¸®°í ÁúÀÇ ¾ð¾î¿Í ÇÁ·Î±×·¡¹Ö ¾ð¾îÇÔ¼ö ¾çÂÊ¿¡¼­µµ ±×°ÍµéÀÌ °¡´ÉÇÑÁö¸¦ ¼³¸íÇÑ´Ù. Postgres rule ½Ã½ºÅÛÀ» °³·«ÀûÀ¸·Î »ìÆ캻 ´ÙÀ½, ±×¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ºÎ·Ï¿¡¼­ °íÀ¯ÀÇ OSº°·Î ½Ã½ºÅÛ È®ÀåÀ» Æ÷ÇÔÇÏ¿© ³íÀÇÇÏ´Â °ÍÀ¸·Î °á·ÐÀ» ³»¸°´Ù. ¿©·¯ºÐµéÀº ÀÌ¹Ì À¯´Ð½º¿Í C ÇÁ·Î±×·¡¹Ö¿¡ ¼÷´ÞµÈ °ÍÀ¸·Î °¡Á¤ÇÑ´Ù. #70 À¯Çü¸ñ (Embryo ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (2,3) 08/24 04:24 240 line 2. Postgres95ÀÇ µ¿ÀÛ¹æ½Ä¿¡ ´ëÇÑ °³³ä. ¼³¸íÀ» °è¼ÓÇϱâ Àü¿¡ ±âº»ÀûÀ¸·Î Postgres ½Ã½ºÅÛÀÌ µ¿ÀÛÇÏ´Â ¹æ½Ä¿¡ ´ëÇÏ¿© ÀÌÇØ ¸¦ ÇÏ¿©¾ß ÇÑ´Ù. PostgresÀÇ ÀϺΰ¡ ¾î¶»°Ô ¹ÝÀÀÇÏ´ÂÁö¸¦ ÀÌÇØÇÏ¸é ´ÙÀ½ ¼½¼ÇÀÌ ´Ù ¼Ò³ª¸¶ ¸íÈ®ÇØ Áú °ÍÀÌ´Ù. Postgres¿¡¼­´Â °£´ÜÇÑ ÇÁ·Î¼¼½º ´ë »ç¿ëÀÚÀÇ Å¬¶óÀ̾ðÆ®/¼­¹ö ¸ðµ¨À» »ç¿ëÇÑ´Ù. Po stgres ¼¼¼ÇÀº À¯´Ð½º ÇÁ·Î¼¼½º·Î ±¸¼ºµÇ¾î ÀÖ´Ù. - ÀÏÁ¾ÀÇ µ¥¸ó ÇÁ·Î¼¼½ºÀÎ postmaster - ÀüÀ§ ÀÀ¿ë ÇÁ·Î±×·¥(¿¹¸¦ µé¾î, psql ÇÁ·Î±×·¥, ±âŸ »ç¿ëÀÚ ÇÁ·Î±×·¥) - ÇÑ°³, ¶Ç´Â ±× ÀÌ»óÀÇ ÈÄÀ§ µ¥ÀÌÅÍ º£À̽º ¼­¹ö(postgres ÇÁ·Î¼¼½º ÀÚü¸¦ ¶æ ÇÔ) postmaster ´Â ÇϳªÀÇ È£½ºÆ®¿¡ ÁÖ¾îÁø µ¥ÀÌÅÍ º£À̽º ÁýÇÕÀ» °ü¸®ÇÑ´Ù. ÀÌ·¯ÇÑ µ¥ ÀÌÅÍ º£À̽º ÁýÇÕÀ» ¼³ºñ ȤÀº site ¶ó ºÎ¸¥´Ù. ÀüÀ§ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥µéÀÌ µ¥ÀÌÅÍ º£À̽º¿¡ Á¢±ÙÇÏ·Á¸é LIBPQ ¶óÀ̺귯¸®¸¦ °ÅÃÄ¾ß ÇÑ´Ù. ÀÌ ¶óÀ̺귯¸®´Â »ç¿ëÀÚÀÇ ¿ä±¸¸¦ ³×Æ®¿öÅ©¸¦ ÅëÇÏ¿© postmaster ¿¡°Ô ¿äûÇÏ°í, po stmaster´Â »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ¿¬°á½ÃÄÑ ¶Ç ÇϳªÀÇ ÈÄÀ§ ¼­¹ö¸¦ ¸¸µç´Ù. ÀÌ·¯ÇÑ Á¡ ¿¡¼­ ÀüÀ§ÀÇ ÇÁ·Î¼¼½º¿Í ÈÄÀ§ÀÇ ¼­¹ö´Â postmaster °£¼·¾øÀ̵µ Åë½ÅÀ» ÇÒ¼ö°¡ ÀÖ´Ù. ±×·¯¹Ç·Î »ç¿ëÀÚÀÇ ¿ä±¸¸¦ ±â´Ù¸®±â À§Çؼ­ postmaster´Â Ç×»ó ½ÇÇàÁßÀÌ´Ù. LIBPQ ¶óÀ̺귯¸®´Â ÇϳªÀÇ ÀüÀ§ÇÁ·Î±×·¥ÀÌ ¿©·¯ ÈÄÀ§ ÇÁ·Î¼¼½º¿Í ¿¬°áÇÏ´Â °ÍÀ» °¡ ´ÉÇϵµ·Ï ÇØÁØ´Ù. ±×·¯³ª ÀüÀ§ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥µéÀº ¾ÆÁ÷ ´ÜÀÏ thread ÇÁ·Î¼¼½ºÀ̸ç Multi-thread ¹æ½ÄÀÇ ÀüÀ§/ÈÄÀ§ÀÇ ¿¬°áÀº ¾ÆÁ÷ LIBPQ¿¡¼­ Áö¿øÇÏÁö ¾Ê´Â´Ù. ÀüÀ§ÀÇ ÇÁ·Î±×·¥µéÀº ¾îµð¼­³ª ½ÇÇàµÉ¼ö ÀÖÁö¸¸, postmaster ¿Í ÈÄÀ§¼­¹ö´Â Ç×»ó °° Àº °÷¿¡¼­ ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ »çÇ×À» ¸Ó¸®¼Ó¿¡¼­ ¸í½ÉÇÏ°í ÀÖ¾î¾ß Çϴµ¥, ±× ÀÌÀ¯´Â Ŭ¶óÀ̾ðÆ®¿¡¼­´Â Á¢±Ù°¡´ÉÇÑ ÆÄÀÏÀÌ µ¥ÀÌÅÍ º£À̽º ¼­¹ö¿¡¼­´Â ºÒ°¡´ÉÇØ Áú ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ, postmaster¿Í postgres°¡ PostgresÀÇ superuser ÀÎÁö¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù. Postgres superuser´Â Ưº°ÇÑ »ç¿ëÀÚ°¡ ¾Æ´Ï´Ù. (´ÜÁö postgres¶ó´Â °èÁ¤À» °¡Áø »ç¿ëÀÚ¸¦ ¶æÇÑ´Ù.) ³ª¾Æ°¡¼­ Posgres superuser ´Â Àý´ë·Î root°¡ ¾Æ´Ï ´Ù. ¾î¶°ÇÑ °æ¿ì¶óµµ µ¥ÀÌÅÍ º£À̽º¿Í °ü°è°¡ ÀÖ´Â ¸ðµç È­ÀÏÀº Postgres supreuser ¿¡ ¼ÓÇØ ÀÖ´Ù. ÁÖ) ------------- ÀϹÝÀûÀ¸·Î ¿ì¸®´Â µ¥ÀÌÅÍ º£À̽º¸¦ ·ÎµùÇÏ°í ¼ÂÆÃÇÒ¼ö ÀÖ´Â ±ÇÇÑÀ» °¡Áø °èÁ¤À» DBA(Data Base Adminstrator)°èÁ¤À̶ó ºÎ¸¥´Ù. ÀϹÝÀûÀ¸·Î ¸ðµç ÇÁ·Î±×·¥ÀÇ ¼³Ä¡´Â root ±ÇÇÑÀ» °¡Áö°í ½ÇÇàÇϵµ·Ï µÇ¾î ÀÖÀ¸³ª DB ¿¡¼­´Â ÀÌ·¯ÇÑ ±ÇÇÑÀ» °¡Áø °èÁ¤À» µû·Î µÐ´Ù. ÀÌ°ÍÀº ¿ö³« µ¥ÀÌÅÍ º£À̽ºÀÇ ±ÇÇÑ ÀÌ ¹æ´ëÇϱ⠶§¹®¿¡ root ¿¡°Ô ÁÖ¾îÁö´Â ºÎ´ãÀ» ÁÙ¿© º¸ÀÚ´Â °Í°ú, DBA°¡ ½Ã½ºÅÛÀÇ ·çÆ® ±ÇÇÑÀ» °¡Áö´Â °ÍÀ» ¹æÁöÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î Çؼ®µÈ´Ù. ¶ÇÇÑ µ¥ÀÌÅÍ º£À̽º¿¡ ´Â »ó´çÈ÷ Áß¿äÇÑ ÀÚ·áµéÀÌ ¸¹ÀÌ ¼ö·ÏµÇ¾î ÀÖÀ¸¹Ç·Î ½Ã½ºÅÛÀÇ ·çÆ®±ÇÇÑÀ̶ó ÇÏ´õ¶ó µµ ±× ³»¿ëÀ» º¼¼ö ¾øµµ·Ï ÇؾßÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. Áï ¹°¸®ÀûÀÎ µ¥ÀÌÅÍ º£À̽ºÀÇ ³»¿ë Àº ·çÆ®ÀÇ ±ÇÇÑÀ¸·Î Áö¿ï¼ö ÀÖÁö¸¸ ³»¿ëÀº º¼¼ö ¾øµµ·Ï ÇØ ¾ß ÇÒ Çʿ伺µµ ÀÖ´Ù. ƯÈ÷ »ó¾÷¿ë DBÀÎ ¿À¶óŬÀÇ °æ¿ì°¡ ÁÁÀº ¿¹¶ó°í ÇÒ¼ö ÀÖ´Ù. 3. Postgres ½ÃÀÛÇϱâ. ÀÌ ºÎºÐ¿¡¼­´Â ÀüÀ§ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À» »ç¿ëÇϱâ À§Çؼ­ Postgres¸¦ ½ÃÀÛÇÏ´Â ¹æ¹ý °ú ÀÚ½ÅÀÇ È¯°æ¿¡ ¸Âµµ·Ï ¼ÂÆÃÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ³íÀÇÇÑ´Ù. ÀÌ¹Ì Postgres´Â ¼º°øÀû À¸·Î ¼³Ä¡µÇ¾ú´Ù°í °¡Á¤ÇÑ´Ù. ( Postgres¸¦ ¼³Ä¡Çϱâ À§Çؼ­´Â ¼³Ä¡ note¸¦ ÂüÁ¶ÇÏ ¶ó.) ÀÌ ºÎºÐ¿¡¼­ Á¦½ÃµÈ ¸î °¡Áö ´Ü°è´Â ¸ðµç Postgres »ç¿ëÀÚ¿Í µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ ¿¡ ÇØ´ç µÇ´Â »çÇ×ÀÌ´Ù. µ¥ÀÌÅÍ º£À̽º ½Ã½ºÅÛ °ü¸®ÀÚ´Â ¼ÒÇÁÆ®¿þ¾î¸¦ ¼³Ä¡ÇÏ°í, µ¥ ÀÌÅÍ º£À̽º¸¦ ¸¸µé°í, postmaster¸¦ ½ÇÇà½ÃÅ°´Â »ç¶÷ÀÌ´Ù. µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ°¡ À¯´Ð½º ÀÇ ¼öÆÛÀ¯ÀúÀÎ rootÀ̰ųª, ÄÄÇ»ÅÍÀÇ Çϵå¿þ¾î ÀûÀÎ °ü¸®ÀÚÀÏ ÇÊ¿ä´Â ¾ø´Ù. ¿©±â¼­´Â ÀÏ¹Ý »ç¿ëÀÚ¸¦ User·Î Ç¥ÇöÇÏ°í, µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ¸¦ Admin À¸·Î Ç¥½Ã Çϵµ·Ï ÇÏ°Ú´Ù. ÀÌ ¼³¸í¼­ÀÇ ¿¹Á¦Áß % ±âÈ£·Î ½ÃÀ۵Ǵ ¹®ÀåÀº À¯´Ð½º ½©»óÀÇ ¸í·É¾î¸¦ ÀǹÌÇϸç, * ±âÈ£´Â Postgres SQL ÁúÀǾî»óÀÇ ¸í·ÉÀ» ¶æÇÑ´Ù. 3.1 Admin / User : »ç¿ëÀÚ È¯°æ Á¶Á¤ ´Ü¼øÇÔÀ» À§ÇÏ¿© Postgres°¡ /usr/local/postgres95 µð·ºÅ丮¿¡ ¼³Ä¡µÇ¾î ÀÖ´Ù°í °¡ Á¤ Çϵµ·Ï ÇÑ´Ù. ±×·¯¹Ç·Î /usr/local/postgres95 ¶ó´Â µð·ºÅ丮¸¦ º¼¶§¸¶´Ù ¿©·¯ºÐ µéÀº ½ÇÁ¦ Postgres°¡ ¼³Ä¡µÈ µð·ºÅ丮¿Í ¹Ù²Ù¾î »ý°¢ÇØ¾ß ÇÑ´Ù. (È¥µ¿À» ÇÇÇϱâ À§ ÇÏ¿© ¾Æ¿¹ óÀ½ºÎÅÍ /usr/local/postgres95 µð·ºÅ丮¿¡ ¼³Ä¡ÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÏ °ÍÀÌ´Ù.) ¸ðµç ¸í·É¾îµéÀº /usr/local/postgres95/bin µð·ºÅ丮¿¡ ¼³Ä¡µÇ¾î ÀÖ´Ù. ±×·¯¹Ç·Î ½© ¸í·É¾î »óÅ¿¡¼­´Â ÀÌ µð·ºÅ丮¸¦ path ¿¡ Ãß°¡ÇØ¾ß ÇÑ´Ù. ´ç½ÅÀÌ ¸¸¾à Berkeley C Shell ÀÇ º¯Á¾À̳ª, tcsh À» »ç¿ëÇÏ°í ÀÖ´Ù¸é .login ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº ÁÙÀ» Ãß °¡ÇÑ´Ù. % set path = ( /usr/local/postgres95/bin $path ) Bourne shell ÀÇ º¯Á¾À̳ª ksh, bash ÀÎ °æ¿ì¿¡´Â .profile ¿¡ ´ÙÀ½°ú °°ÀÌ ¾´´Ù. $ PATH=/usr/local/postgres95/bin:$PATH $ export PATH ÀÌÁ¦ Postgres ÀÇ bin µð·ºÅ丮°¡ path¿¡ Ãß°¡µÇ¾ú´Ù°í °¡Á¤ÇÏ°Ú´Ù. ºÎ°¡ÀûÀ¸·Î ÀÌ ¼³¸í¼­¸¦ ÅëÇÏ¿© ½©º¯¼ö ÁöÁ¤ ¶Ç´Â ȯ°æº¯¼ö ÁöÁ¤À̶ó´Â °ÍÀ» ÀÚÁÖ ÂüÁ¶ÇÏ°Ô µÉ °Í ÀÌ´Ù. path¸¦ º¯°æÇϴµ¥ À־ À§ ¹®´ÜÀÇ ³»¿ëµéÀ» ÃæºÐÈ÷ ÀÌÇØÇÒ¼ö ¾ø¾ú´Ù¸é, ´ÙÀ½À¸·Î ³Ñ¾î°¡±â Àü¿¡ ´ç½ÅÀÌ »ç¿ëÁßÀÎ ½©À» ±â¼úÇØ ³õÀº À¯´Ð½º ¼³¸í¼­¸¦ Âü°íÇÏ ¿©¾ß ÇÑ´Ù. 3.2 Admin : Postmaster ½ÃÀÛÇϱâ. ³íÀÇ¿¡ ¾Õ¼­ postmaster ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ¾î ÀÖÁö ¾ÊÀ¸¸é µ¥ÀÌÅÍ º£À̽º¿¡ ´ëÇÑ ¾î ¶°ÇÑ ÀÛ¾÷µµ ºÒ°¡´ÉÇÏ´Ù´Â °ÍÀ» ¸í¹éÈ÷ ÇÏ°íÀÚ ÇÑ´Ù. ´ç½ÅÀÌ ¸¸¾à Admin À̶ó¸é pos tmaster¸¦ ½ÇÇàÇϱâ Àü¿¡ ¸î °¡Áö ±â¾ïÇØ µÎ¾î¾ß¸¸ Çϴ°ÍÀÌ ÀÖ´Ù. ÀÌ ¼³¸í¼­¿¡¼­´Â 'Administering Postgres' ¶ó´Â Á¦¸ñÀÌ ÀÖ´Â ºÎºÐ¿¡¼­ ±×°ÍÀ» ´Ù·ç±â·Î ÇÑ´Ù. ±×·¯ ³ª ¿©±â ¾²¿©Áø °Í°ú °°ÀÌ Á¤È®ÇÏ°Ô Postgres°¡ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, ´ÙÀ½°ú°°Àº °£´Ü ÇÑ ¸í·É¾î·Î postmaster ¸¦ ½ÃÀÛÇÒ¼ö ÀÖ´Ù. % postmaster & postmaster´Â ¹®Á¦°¡ ¹ß»ýÇÒ °æ¿ì µµ¿òÀÌ µÇ´Â ¾î¶² ¸Þ¼¼Áö¸¦ ³»º¸³»°ï ÇÑ´Ù. ¸¸ ¾à postmaster·Î ºÎÅÍ µð¹ö±ë ¸Þ¼¼Áö¸¦ º¸°í ½ÍÀº °æ¿ì¿¡´Â -d ¿É¼ÇÀ» ÁÖ°í, ±×°ÍÀ» redirect ·Î ¹Þ¾Æ¼­ ÀúÀåÇÏ¸é µÈ´Ù. % postmaster -d >& pm.log & ¸Þ¼¼Áö¸¦ º¸°í ½ÍÁö ¾ÊÀº °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù. % postmaster -S ±×·¯¸é postmaster ´Â ¾Æ¹«°Íµµ Ç¥½ÃÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ³¡¿¡ & °¡ ºÙÁö ¾Ê¾ÒÀ½¿¡ À¯ ÀÇÇ϶ó. 3.3 Admin : »ç¿ëÀÚÀÇ Ãß°¡ ¹× »èÁ¦. createuser ¸í·É¾î´Â ¾î¶² Ưº°ÇÑ »ç¿ëÀÚ°¡ Postgres¿¡ Á¢±Ù °¡´ÉÇϵµ·Ï ÇØÁØ´Ù. ÀÌ ¿Í ¹Ý´ë·Î destroyuser ¸í·É¾î´Â »ç¿ëÀÚ¸¦ »èÁ¦ÇÏ°í, Postgres¿¡ Á¢±ÙÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. ÀÌ·¯ÇÑ ¸í·É¾îµéÀº ´ÜÁö Postgres»ç¿ëÀÚ¿¡ ´ëÇؼ­¸¸ È¿°ú°¡ ÀÖ´Ù´Â °Í¿¡ À¯ÀÇ Ç϶ó. OS ¸¦ °ü¸®ÇÏ´Â »ç¿ëÀÚ¿¡°Ô´Â ¾Æ¹« È¿°ú°¡ ¾ø´Ù. 3.4 User : ÀÀ¿ë ÇÁ·Î±×·¥ ½ÃÀÛÇϱâ. µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ (site adminstrator)°¡ ÀûÀýÇÏ°Ô postmaster ÇÁ·Î¼¼½º¸¦ ½ÃÀÛ ÇÏ ¿´°í, ´ç½ÅÀÌ »ç¿ëÀڷμ­ µ¥ÀÌÅÍ º£À̽º¿¡ Á¢±ÙÇÒ¼ö ÀÖ´Â ±ÇÇÑÀ» ºÎ¿© ¹Þ¾ÒÀ¸¸é ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ¾Õ¿¡¼­ ¾ð±ÞÇß´ø °Í ó·³ ´ç½ÅÀº path¿¡ /usr/lo- cal/postgres95/bin µð·ºÅ丮¸¦ Ãß°¡ÇØ¾ß ÇÑ´Ù. ´ëºÎºÐÀÇ °æ¿ì ÀÌ Á¤µµ°¡ ´ç½ÅÀÌ ÁØ ºñÇØ¾ß ÇÒ ³»¿ëÀÇ ÀüºÎÀÌ´Ù. ¸¸¾à Postgres ¸í·É¾î (psqlÀ̳ª createdb) ½ÇÇà µµÁß¿¡ ´ÙÀ½°ú °°Àº ¿¡·¯¸Þ¼¼Áö¸¦ ³µ´Ù¸é, ±×°ÍÀº ´ÙÀ½°ú °°Àº °æ¿ì¿¡ ÇØ´çÇÑ´Ù. connectDB() failed : Is the postmaster running at 'localhost' on port '4322' ? postmaster °¡ ½ÇÇàµÇÁö ¾Ê¾Ò°Å³ª, À߸øµÈ server host ¿¡ ¿¬°áÀ» ½ÃµµÇÏ·Á°í ÇßÀ» °æ¿ìÀÌ´Ù. ¸¸¾à ´ÙÀ½°ú °°Àº ¿¡·¯¸Þ¼¼Áö¸¦ ¸¸³µ´Ù¸é µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ°¡ ¿Ã¹Ù¸¥ °èÁ¤À¸·Î postmaster ¸¦ ½ÇÇà½ÃÅ°Áö ¾Ê¾Ò´Ù´Â ¶æÀÌ´Ù. FATAL 1:Feb 17 23:19:55:process userid (2360) != database owner (268) ÀÌ·²¶§´Â ´Ù½Ã postmaster¸¦ ¼öÇàÇϵµ·Ï Postgres superuser ¿¡°Ô ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. 3.5 User : Database °ü¸®Çϱâ Postgres°¡ ½ÇÇàÁßÀ̶ó¸é ½ÃÇè»ï¾Æ ¸î °³ÀÇ µ¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé¼ö ÀÖ´Ù. ¿©±â ±â º»ÀûÀÎ µ¥ÀÌÅÍ º£À̽º ¸í·É¾îµéÀ» ¼Ò°³ÇÑ´Ù. Data Base ÀÛ¼ºÇϱâ ÀÚ, ´ç½ÅÀÌ mydb ¶ó´Â À̸§ÀÇ µ¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé°íÀú ÇÑ´Ù. ±×·¸´Ù¸é ´ÙÀ½°ú °° Àº ¸í·É¾î¸¦ ÁÖ¸é µÈ´Ù. % createdb mydb Postgres´Â ÁÖ¾îÁø °÷¿¡ ¾ó¸¶µçÁö ¿©·¯°³ÀÇ µ¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé ¼ö ÀÖµµ·Ï ÇØ ÁÖ ¸ç, ±× ¼ø°£¿¡´Â ÀÚµ¿À¸·Î ¿©·¯ºÐÀÌ µ¥ÀÌÅÍ ½Ã½ºÅÛ °ü¸®ÀÚ°¡ µÈ´Ù. µ¥ÀÌÅÍ º£À̽ºÀÇ À̸§Àº ¾ËÆĺª ±ÛÀÚ°¡ óÀ½¿¡ ¿Í¾ß ÇÏ°í, ±æÀÌ´Â 16±ÛÀÚ·Î Á¦ÇѵȴÙ. ¸ðµç »ç¿ëÀÚ°¡ µ¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé¼ö ÀÖ´Â ±ÇÇÑÀ» ºÎ¿©¹Þ´Â °ÍÀº ¾Æ´Ï´Ù. ¸¸¾à ´ç ½ÅÀÌ Postgres¿¡¼­ µ¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé¼ö ¾ø´Ù¸é µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ·Î ºÎÅÍ µ¥ ÀÌÅÍ º£À̽º¸¦ »ý¼ºÇÒ¼ö ÀÖ´Â Çã°¡±ÇÀ» ¾ò¾î¾ß ÇÑ´Ù. ÀÌ·² ¶§´Â µ¥ÀÌÅÍ º£À̽º °ü¸® ÀÚ¿Í ÀÇ ³íÇϵµ·Ï ÇÏÀÚ. Data Base Á¢±ÙÇϱ⠵¥ÀÌÅÍ º£À̽º¸¦ ¸¸µé¾úÀ¸¸é ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î Á¢±ÙÇÒ¼ö ÀÖ´Ù. - Postgres Å͹̳Π¸ð´ÏÅ͸µ ÇÁ·Î±×·¥À» ¼öÇàÇÑ´Ù.(monitor ¶Ç´Â psql). ¿©±â¼­´Â ´ëÈ­¹æ½ÄÀ¸·Î ÀÔ·Â, ¼öÁ¤, SQL ¸í·É¾îÀÇ ¼öÇà µîÀÌ °¡´ÉÇÏ´Ù. - LIBPQ ÀÇ ¼­ºê ·çƾÀ» »ç¿ëÇÏ´Â C ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù. ÀÌ°ÍÀ» »ç¿ëÇϸé C ¿¡ ¼­ SQL ¸í·É¾î¸¦ »ç¿ëÇÒ¼ö ÀÖÀ¸¸ç, ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼­ °á°ú¿Í »óȲ ¸Þ¼¼Áö µéÀ» ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹æ¹ý¿¡ ´ëÇؼ­´Â ´ÙÀ½ ºÎºÐ¿¡¼­ ³íÀÇ ÇÑ´Ù. ÀÌ ¼³¸í¼­ÀÇ ¿¹Á¦¸¦ ½ÃÇèÇØ º¸·Á¸é psqlÀ» ¼öÇàÇÏ¿©¾ß ÇÑ´Ù. ´ÙÀ½°ú °°Àº ¸í·É¾î·Î mydb¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â »óÅ°¡ µÈ´Ù. % psql mydb ´ÙÀ½°ú °°Àº ȯ¿µ ¸Þ¼¼Áö(?)¸¦ ¹Þ°Ô µÉ °ÍÀÌ´Ù. Welcome to the Postgres95 interactive sql monitor type \? for help on slash commands type \q to quit type \g to terminate with semicolon to excute query You are currently conneted to the database: mydb mydb => ÀÌ ÇÁ·ÒÇÁÆ®´Â Å͹̳θð´ÏÅÍ°¡ ÀÌÁ¦ºÎÅÍ ´ç½ÅÀÇ ¸í·ÉÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù´Â ¶æÀÌ´Ù. ÀÌÁ¦ Å͹̳Π¸ð´ÏÅÍ°¡ Á¦°øÇÏ´ÂÀÛ¾÷ ¿µ¿ª¿¡¼­ SQL Äõ¸®¸¦ ¾µ ¼ö ÀÖ´Ù. psqlÀº ¿ª½½ ·¡½Ã(\)·Î ½ÃÀÛÇÏ´Â escapeÄڵ忡 ÀÀ´äÇÑ´Ù. ¿¹¸¦ µé¾î, Postgres¿¡ ´ëÇÑ ¿©·¯ °¡Áö ¹®¹ýÀû µµ¿ò¸»À» ¾ò±â À§Çؼ­´Â ¸í·É¾î ¶óÀο¡¼­ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù. mydb => \h Äõ¸® ¹®ÀåÀÌ ³¡³µÀ½À» ¾Ë¸®°í, ÀÛ¾÷°ø°£ÀÇ ³»¿ëÀ» Postgres¼­¹ö¿¡ ¾Ë·ÁÁÖ±â À§ÇØ ´Ù À½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù. mydb => \g ÀÌ°ÍÀº ¼­¹ö¿¡°Ô Äû¸®ÀÇ ³»¿ëÀ» ½ÇÇàÇ϶ó´Â ¶æÀÌ´Ù. ¸¸¾à ¹®Àå ³¡¿¡ ¼¼¹ÌÄÝ·ÐÀ» »ç ¿ë Çß´Ù¸é \g ´Â ÇÊ¿ä¾ø´Ù. ¼¼¹ÌÄÝ·ÐÀÌ ºÙÀ¸¸é psql Àº ÀÚµ¿À¸·Î Äõ¸®¸¦ ó¸®ÇÑ´Ù. ¿ÜºÎ È­ÀÏ·Î ºÎÅÍ Äõ¸® ³»¿ëÀ» ÀоîµéÀ̱â À§Çؼ­´Â ´ëÈ­Çü ¹æ½Ä´ë½Å ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù. mydb => \i filename À¯´Ð½º·Î ºüÁ®³ª°¡±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù. mydb => \q ±×·¯¸é psqlÀÌ Á¾·áµÇ°í, À¯´Ð½º ¸í·É¾î¸¦ ¾µ ¼ö ÀÖ´Â ½© »óÅ°¡ µÈ´Ù. ( ´õ ÀÚ¼¼ÇÑ °ÍÀº \h¸¦ ÀÔ·ÂÇØ º¸¶ó.) ÅÇ È¤Àº ºóÄ­Àº SQL Äõ¸®³»¿¡¼­ ¾ó¸¶µçÁö ¾µ¼ö ÀÖ´Ù. dash ÀÌÈÄ¿¡ ¾²¿©Áø ¸ðµç ÁÙµéÀº ¹«½ÃµÇ¸ç, ±×°ÍÀº °ð ÁÖ¼®À¸·Î 󸮵ÊÀ» ÀǹÌÇÑ´Ù. Data Base »èÁ¦Çϱ⠴ç½ÅÀÌ mydb ¿¡ ´ëÇÑ µ¥ÀÌÅÍ º£À̽º °ü¸®ÀÚ¶ó¸é ´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ ½á¼­ »èÁ¦ ÇÒ ¼öÀÖ´Ù. % destroydb mydb ÀÌ·¯ÇÑ ¸í·É¾î´Â µ¥ÀÌÅÍ º£À̽º¿¡ °ü°èµÈ ¸ðµç À¯´Ð½º È­ÀÏÀ» ¹°¸®ÀûÀ¸·Î Áö¿ö¹ö¸® ±â ¶§¹®¿¡ º¹±¸ ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ±×·¯¹Ç·Î ÀÛ¾÷¿¡ ¾Õ¼­¼­ ´õ¿í ½ÅÁßÇÏ°Ô »ý°¢ÇØ¾ß ÇÒ °ÍÀÌ´Ù. #57 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (4-1) 08/10 04:23 154 line ---------------------------------------- Postgres95 1.0 »ç¿ëÀÚ ¸Þ´º¾ó ÇÑ±Û ¹ø¿ª ---------------------------------------- ¹ø¿ª : Çѵ¿ÈÆ active@soback.kornet.nm.kr ³¯Â¥ : Sun Aug 10 04:18:20 KST 1997 º» ³»¿ëÀº Postgres95 ÀÇ 1.0 »ç¿ëÀÚ ¸Þ´º¾óÀ» Çѱ۷Π¹ø¿ªÇÏ´Â °ÍÀÔ´Ï´Ù. Æ´Æ´È÷ ¹ø¿ªÇÏ¿© ¿Ã¸± ¿¹Á¤ÀÔ´Ï´Ù. ---------- 4. ÁúÀǾî POSTGRES ¿¡¼­ »ç¿ëÇÏ´Â ÁúÀǾî´Â SQL-3 ÀÇ º¯ÇüÀÌ´Ù. POSTGRES ÀÇ Áú¾îÀÇ¿¡´Â È®Àå°¡´ÉÇÑ ÇüÅÂÀÇ ½Ã½ºÅÛ, »ó¼Ó, ÇÔ¼ö, »ý¼º±ÔÄ¢°ú °°Àº °ÍÀ» °¡Áö°í ÀÖ´Ù. ÀÌ·¯ÇÑ Æ¯Â¡Àº ¿ø·¡ÀÇPOSTGRES ÁúÀǾîÀÎ POSTQUEL ¿¡¼­ ³ª¿Ô´Ù. ÀÌÀå¿¡¼­´Â °£´ÜÇÑ ÀÛµ¿À» POSTGRES SQL À» »ç¿ëÇÏ¿© ½ÃÇàÇØ º»´Ù. ÀÌ ¸Å´º¾óÀº SQL ÀÇ Çൿ¾ç½ÄÀ» º¸¿©ÁÙ »Ó, ¿ÏÀüÇÑ SQL ±³Àç´Â ¾Æ´Ï´Ù. SQL ¿¡ ´ëÇÑ Ã¥Àº ½ÃÁß¿¡ ¸¹ÀÌ ³ª¿ÍÀÖ´Ù. ±×¸®°í ¿©±â¿¡ ³ª¿À´Â ¸î¸î Ư¡µéÀº ANSI Ç¥ÁØÀÌ ¾Æ´Ï´Ù. ¾Æ·¡¿¡ ¿¹¸¦ µé¾îº¸ÀÚ. ¿©±â¿¡¼­´Â, ¹Ù·Î ¾ÕÀå¿¡¼­ ³ª¿Ô´ø °Í°ú °°ÀÌ mydb ¶ó´Â µ¥ÀÌÅͺ£À̽º¸¦ ¸¸µé¾î µÎ¾ú°í, psql À» ½ÇÇàÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ. ÀÌ ¸Þ´º¾ó¿¡ ³ª¿À´Â ¿¹Á¦´Â /usr/local/postgres95/src/tutorial ¿¡µµ ³ª¿ÍÀÖ´Ù. ÀÌ ¿¹Á¦µéÀ» ¾î¶»°Ô »ç¿ëÇÏ´Â Áö´Â ÇØ´ç µð·ºÅ丮¿¡ ÀÖ´Â README ÆÄÀÏÀ» Àß ÀÐ¾î º¸¸é µÈ´Ù. ´ÙÀ½°ú °°ÀÌ µû¶óÇÏÀÚ. % cd /usr/local/postgres95/src/tutorial % psql -s mydb Welcome to the POSTGRES95 interactive sql monitor: type \? for help on slash commands type \q to quit type \g or terminate with semicolon to execute query You are currently connected to the database: jolly mydb=> \i basics.sql '\i' ¸í·ÉÀ» »ç¿ëÇϸé ƯÁ¤ÇÑ ¿ÜºÎÆÄÀÏ¿¡¼­ ÁúÀǾ Àо ó¸®ÇÒ ¼ö ÀÖ´Ù. ¸í·ÉÇà¿¡¼­ÀÇ '-s' ¿É¼ÇÀº ÇϳªÀÇ Ä¿¸®¸¦ backend ·Î º¸³»±â Àü¿¡ Á¤ÁöÇÏ´Â ½Ì±Û ½ºÅÜ ¸ðµå·Î ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. 4.1 °³³ä POSTGRES ¿¡¼­ ±âº»ÀûÀÎ °³³äÀº Ŭ·¡½º(class) ÀÌ´Ù. Ŭ·¡½º´Â °´Ã¼·Î¼­ÀÇ ÀνºÅÏ ½º (instances) ÀÇ °áÁýüÀÌ´Ù. °¢°¢ÀÇ ÀνºÅϽº´Â °°Àº ¼Ó¼º(attributes)ÀÇ ÁýÇÕ À» °¡Áö°í ÀÖ°í, °¢°¢ÀÇ ¼Ó¼ºÀº ƯÁ¤ÇÑ Çü(type)ÀÌ´Ù. ´õ ³ª¾Æ°¡, °¢°¢ÀÇ ÀνºÅϽº ´Â ¿µ±¸ÀûÀÎ °´Ã¼ ½Äº°ÀÚ(object identifier - OID)¸¦ °¡Áö°Ô µÇ¸ç, ÀÌ ½Äº°ÀÚ´Â ¼³ Ä¡ ½ÃºÎÅÍ Áߺ¹µÇÁö ¾Ê´Â À¯ÀÏÇÑ °ÍÀÌ´Ù. SQL ¹®¹ýÀº Å×À̺í(table)À» ÂüÁ¶Çϱ⠶§ ¹®¿¡, Ŭ·¡½º(class) ¶ó´Â °³³ä´ë½Å Å×À̺í(table)À̶ó´Â ¸»À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸¶ Âù °¡Áö·Î, ¿­(row) ´Â ÀνºÅϽº(instance)ÀÌ°í, Ä÷³(columns)Àº ¼Ó¼º(attributes) ÀÌ´Ù. ¾Õ¿¡¼­ »ìÆ캻 ¹Ù¿Í °°ÀÌ, Ŭ·¡½º´Â ±×·ìÈ­µÇ¾î µ¥ÀÌÅͺ£À̽º¸¦ ÀÌ·ç°í, µ¥ÀÌÅͺ£ À̽ºÀÇ ÁýÇÕÀº ÇϳªÀÇ postmaster ÇÁ·Î¼¼½º¿¡ ÀÇÇØ °ü¸®µÈ´Ù. 4.2 »õ·Î¿î Ŭ·¡½ºÀÇ »ý¼º Ŭ·¡½ºÀÇ À̸§À» ÁöÁ¤ÇÏ¿© »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µé ¼ö ÀÖ´Ù. À̶§ ¸ðµç ¼Ó¼º°ú Çü À» ¸í½ÃÇÑ´Ù. CREATE TABLE weather ( cityvarchar(80), temp_lo int, - ÃÖÀú¿Âµµ temp_hi int, - ÃÖ°í¿Âµµ prcp real, - °­¼ö·® date date ); ¿¹¾à¾î(keyword)¿¡´Â ¹«½Å°æÇصµ µÇÁö¸¸ ½Äº°ÀÚ¿¡´Â ÁÖÀÇÇÏ¿©¾ß ÇÑ´Ù. POSTGRES SQL Àº Æò¹üÇÑ SQL ŸÀÔÀ¸·Î int, float, real, smallint, char(N), varchar(N), date, time À» Á¦°øÇÑ´Ù. ³ªÁß¿¡ »ìÆ캸°ÚÁö¸¸, POSTGRES ¿¡¼­´Â »ç¿ëÀÚ°¡ µ¥ÀÌ ÅÍ ÇüÀ» ÀÚ½ÅÀÌ ¸¶À½´ë·Î Á¤ÇÒ ¼ö ÀÖ´Ù. °á°úÀûÀ¸·Î, ÇüÀÇ ¸íĪÀº ¿¹¾à¾î°¡ ¾Æ´Ï ´Ù. ³ª¾Æ°¡, POSTGRES ÀÇ 'create' ¸í·É¾î´Â ÀüÅëÀûÀÎ °ü°èÇü ½Ã½ºÅÛ¿¡¼­ Å×À̺íÀ» »ý ¼º ÇÏ´Â µ¥ »ç¿ëÇÏ´Â ¸í·É¾î¿Í ¾ÆÁÖ À¯»çÇÏ´Ù. ±×·¯³ª, Ŭ·¡½º´Â °ü°èÇü ¸ðµ¨À» È®ÀåÇÏ´Â µ¶ÀÚÀûÀΠƯ¼ºÀ» °¡Áö°í ÀÖÀ½À» °ð ¾Ë¾Æº¼ °ÍÀÌ´Ù. 4.3 Ŭ·¡½º¿¡ ÀνºÅϽº¸¦ »ðÀÔÇϱâ Ŭ·¡½º¿¡ ÀνºÅϽº¸¦ »ðÀÔÇÏ´Â µ¥´Â 'insert' ±¸¹®À» »ç¿ëÇÑ´Ù. INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994') 'copy' ¸í·ÉÀ» »ç¿ëÇϸé, Æò¹üÇÑ ¾Æ½ºÅ° ÆÄÀÏ¿¡¼­ ´ë±Ô¸ðÀÇ µ¥ÀÌÅ͸¦ ÀûÀçÇÒ ¼ö ÀÖ´Ù. 4.4 Ŭ·¡½º¿¡ ÁúÀÇÇϱâ weather Ŭ·¡½º¿¡ º¸ÅëÀÇ °ü°èÇü ¼±ÅÃ, °èȹ Ä¿¸®¸¦ ´øÁú ¼ö ÀÖ´Ù. SQL 'select' ±¸¹®À» ÀÌ·¯ÇÑ ¸ñÀû¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±¸¹®Àº ´ë»ó ¸ñ·Ï ºÎºÐ(target list - ¹ÝȯµÉ ¼Ó¼º ¸ñ·ÏºÎºÐ) °ú ÁúÀǺκÐ(¾î¶°ÇÑ Á¦ÇÑÀ» ¸í½ÃÇÏ´Â ºÎºÐ)À¸·Î ³ª´­ ¼ö ÀÖ´Ù. ¿¹¸¦ µéÀÚ¸é, weather ÀÇ ¸ðµç ¿­(row)À» ¾Ë¾Æº¸±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÉ °ÍÀÌ´Ù. SELECT * FROM WEATHER; ±×·¯¸é, Ãâ·ÂÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù. city |temp_lo|temp_hi|prcp| date -------------+-------+-------+----+---------- San Francisco| 46| 50|0.25|11-27-1994 San Francisco| 43| 57| 0|11-29-1994 Hayward | 37| 54| |11-29-1994 (3 rows) ¾Æ¿ï·¯, ´ë»ó ¸®½ºÆ®¿¡ Ç¥Çö½ÄÀ» ¸¶À½´ë·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½°ú °°ÀÌ ÁúÀǸ¦ ÇÒ ¼ö µµ ÀÖ´Ù. SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather; Ä¿¸® ½Ã¿¡ Ä¿¸®ºÎºÐ¿¡ ºÎ¿ï·± ¿ÀÆÛ·¹ÀÌÅÍ(and, or, not) À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½°ú °°´Ù. SELECT * FROM weather WHERE city = 'San Francisco' and prcp > 0.0; city |temp_lo|temp_hi|prcp| date -------------+-------+-------+----+---------- San Francisco| 46| 50|0.25|11-27-1994 (1 row) ¸¶Áö¸· Âü°í»çÇ×À¸·Î, select ÀÇ °á°ú¸¦ ¼ø¼­´ë·Î Á¤·ÄÇϰųª, Áߺ¹µÇ´Â ÀνºÅϽº ¸¦ Á¦°ÅÇÒ ¼öµµ ÀÖ´Ù. SELECT * FROM weather ORDER BY city; 4.5 select °á°ú¸¦ ¸®´ÙÀÌ·ºÆ®Çϱâ select Ä¿¸®´Â »õ·Î¿î Ŭ·¡½º·Î ¸®´ÙÀÌ·ºÆ® Çϵµ·Ï »ç¿ëÇÒ ¼ö ÀÖ´Ù. SELECT * INTO temp from weather; ÀÌ·¯ÇÑ select ÀÇ »ç¿ëÀº, ¹¬½ÃÀûÀÎ create ¸í·É¾î¸¦ »ý¼ºÇÏ¿©, »õ·Î¿î Ŭ·¡½º·Î temp ¸¦ »ý¼ºÇÏ´Â µ¥, ÀÌ ¶§ ¼Ó¼º°ú ÇüÀº 'SELECT INTO' ¸í·É¾î¿¡¼­ ´ë»ó ¸®½ºÆ®¿¡ ¸í½ÃµÈ ¼Ó¼º ¸íĪ°ú ÇüÀÌ »ç¿ëµÈ´Ù. ¹°·Ð, ´Ù¸¥ Ŭ·¡½º»ó¿¡¼­ °á°úÀûÀ¸·Î »ý¼ºµÈ Ŭ·¡½º¿¡¼­µµ ¾î¶°ÇÑ µ¿ÀÛµµ ¼öÇàÇÒ ¼ö ÀÖ´Ù. #58 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (4-2) 08/10 22:06 95 line 4.6 Ŭ·¡½º°£ÀÇ °áÇÕ Áö±Ý±îÁö, ÇϳªÀÇ ÁúÀÇ´Â Çѹø¿¡ ÇϳªÀÇ Å¬·¡½º¸¸À» ¾ï¼¼½º ÇØ¿Ô´Ù. ÁúÀÇ´Â Çѹø¿¡ ¿©·¯ Ŭ·¡½º¸¦ ¾ï¼¼½ºÇϰųª, Ŭ·¡½ºÀÇ ¿©·¯ ÀνºÅϽº¸¦ µ¿½Ã¿¡ ´Ù·ç´Â ¹æ¹ýÀ¸·Î µ¿ÀÏÇÑ Å¬·¡½º¸¦ ¾ï¼¼½º ÇÒ ¼ö ÀÖ´Ù. Çѹø¿¡ °°Àº Ŭ·¡½º³ª ¼­·Î´Ù¸¥ Ŭ·¡½ºÀÇ ¿©·¯ ÀνºÅϽº¿¡ Á¢±ÙÇÏ´Â ÁúÀǸ¦ '°áÇÕ ÁúÀÇ(join query)' ¶ó°í ºÎ¸¥´Ù. ÇϳªÀÇ ¿¹·Î, ´Ù¸¥ ·¹ÄÚµåÀÇ ¿Âµµ ¹üÀ§¿¡ ÀÖ´Â ¸ðµç ·¹Äڵ带 ã°í ½ÍÀ» ¶§¸¦ °¡Á¤ Çغ¸ÀÚ. °á°úÀûÀ¸·Î, ¿ì¸®´Â °¢°¢ÀÇ EMP ÀνºÅϽºÀÇ temp_lo ¿Í temp_hi ¼Ó¼ºÀ» ´Ù¸¥ ¸ðµç EMP ÀνºÅϽºÀÇ temp_lo ¿Í temp_hi ¼Ó¼º°ú ºñ±³ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. (ÁÖ2 - ÀÌ°ÍÀº ´ÜÁö °³³äÀûÀÎ ¸ðµ¨ÀÏ »ÓÀÌ´Ù. ½ÇÁ¦ÀûÀÎ °áÇÕÀº Á»´õ È¿À²ÀûÀÎ ¹æ¹ý À¸·Î ÀÌ·ç¾î Áú °ÍÀÌÁö¸¸, »ç¿ëÀÚÀÇ ´«¿¡´Â º¸ÀÌÁö ¾Ê´Â´Ù. ) ÀÌ·¯ÇÑ ÀÛ¾÷Àº ´ÙÀ½ÀÇ Ä¿¸®·Î ÇÒ ¼ö ÀÖ´Ù. SELECT W1.city, W1.temp_lo, W1.temp_hi, W2.city, W2.temp_lo, W2.temp_hi FROM weather W1, weather W2 WHERE W1.temp_lo < W2.temp_lo and W1.temp_hi > W2.temp_hi; city |temp_lo|temp_hi|city |temp_lo|temp_hi -------------+-------+-------+-------------+-------+------- San Francisco| 43| 57|San Francisco| 46| 50 Hayward | 37| 54|San Francisco| 46| 50 (2 rows) ÀÌ °æ¿ì¿¡, W1 °ú W2 ´Â Ŭ·¡½º weather ÀÇ ÀνºÅϽº¸¦ À§ÇÑ ´ë¿ëÀ̸ç, ¾çÂÊÀÇ ¹üÀ§ ´Â Ŭ·¡½ºÀÇ ¸ðµç ÀνºÅϽº¸¦ ³Ñ´Â´Ù. (µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛÀÇ Àü¹®¿ë¾î·Î W1 °ú W2 ´Â "¹üÀ§ º¯¼ö(range variables)"¶ó ÇÑ´Ù.) ÇϳªÀÇ ÁúÀǴ Ŭ·¡½º À̸§°ú ±×ÀÇ ´ë¿ëÀ» ÀÚÀ¯·Ó°Ô Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. (ÁÖ3 - ÀÌ·¯ÇÑ °áÇÕÀÇ Àǹ̴Â, ÁúÀǺκÐÀº µ¥Ä«¸£Æ®ÀÇ product ¿¡¼­ Á¤ÀÇÇÑ Å¬·¡½º ½ÄÀÇ Áø¸®°ªÀÇ Ç¥ÇöÀ̶ó´Â °ÍÀÌ´Ù. ÁúÀǺκÐÀÌ ÂüÀÎ µ¥Ä«¸£Æ®ÀÇ product ¿¡¼­ÀÇ ÀÌ·¯ÇÑ ÀνºÅϽº¸¦ À§Çؼ­, POSTGRES ´Â ´ë»ó ¸®½ºÆ®¿¡¼­ ÁöÁ¤ÇÑ °ªÀ» °è»ê ÇÏ¿© ¹ÝȯÇÑ´Ù. POSTGRES SQL Àº ÀÌ·¯ÇÑ Ç¥Çö¿¡¼­ °ªÀ» º¹»çÇÏ´Â µ¥ ¾î¶°ÇÑ Àǹ̵µ ºÎ¿©ÇÏÁö ¾Ê´Â´Ù. ÀÌ Àǹ̴ POSTGRES ´Â °¡²û °°Àº ´ë»ó ¸®½ºÆ®¸¦ ¿©·¯¹ø Àç°è»ê ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. - ÀÌ°ÍÀº ÀÚÁÖ ºÎ¿ï·± Ç¥ÇöÀÌ 'or' ·Î ¿¬°áµÇ¾úÀ» ¶§ ³ªÅ¸ ³­´Ù. ÀÌ·¯ÇÑ º¹»ç¸¦ ÇÇÇϱâ À§Çؼ­´Â, 'select distinct' ±¸¹®À» »ç¿ëÇÏ¿©¾ß ÇÑ ´Ù.) 4.7 °»½Å 'update' ¸í·ÉÀ» »ç¿ëÇϸé Á¸ÀçÇÏ´Â ÀνºÅϽº¸¦ °»½ÅÇÒ ¼ö ÀÖ´Ù. 11¿ù 28ÀÏ ÀÌÈÄÀÇ ÃÖ°í¿Âµµ¿Í ÃÖÀú¿Âµµ¸¦ 2µµ¾¿ °¨¼Ò½ÃÄÑ¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù°í »ý°¢Çغ¸ÀÚ. ÀÌ·¯ÇÑ °»½ÅÀº ´ÙÀ½ÀÇ ÁúÀǷΠó¸®ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. UPDATE weather SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 WHERE date > '11/28/1994'; 4.8 »èÁ¦ »èÁ¦´Â 'delete' ¸í·ÉÀ» »ç¿ëÇÑ´Ù. DELETE FROM weather WHERE city = 'Hayward'; Hayward ¿¡ °ü·ÃµÈ ¸ðµç ³¯¾¾±â·ÏÀº »èÁ¦ÇÑ´Ù. ´ÙÀ½°ú °°Àº »ç¿ëÀº Á¶½ÉÇØ¾ß ÇÑ´Ù. DELETE FROM classname; 'delete' ¸í·ÉÀº ¿©·¯ºÐ¿¡°Ô ¹°¾îº¸Áöµµ ¾Ê°í ÁöÁ¤ÇÑ Å¬·¡½ºÀÇ ¸ðµç ÀνºÅϽº¸¦ °£ ´ÜÈ÷ »èÁ¦Çؼ­ °øÇ㸸ÀÌ ³²°Ô µÈ´Ù. ½Ã½ºÅÛÀº ÀÌ·¯ÇÑ »èÁ¦ÀÛ¾÷ ÀÌÀü¿¡ È®ÀÎÀ» ¿ä±¸ ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. 4.9 Àüü ÇÔ¼öÀÇ »ç¿ë ´Ù¸¥ ÁúÀǾî¿Í ¸¶Âù°¡Áö·Î, POSTGRES ´Â Àüü ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ±×·¯³ª, ÇöÀçÀÇ POSTGRESÀÇ Àüü ÇÔ¼ö´Â ¸Å¿ì Á¦ÇÑÀûÀÌ´Ù. Ưº°È÷, Ƚ¼ö, ÇÕ°è, Æò±Õ, ÃÖ´ë, ÃÖ¼Ò µîÀÇ °è»ê¿¡ °ü·ÃµÈ Àüü ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. À̵é ÇÔ¼ö´Â ÀνºÅϽºÀÇ ÁýÇÕ¿¡ Àû¿ëµÇ ¸ç, ÁúÀÇÀÇ ´ë»ó ¸®½ºÆ®¿¡¸¸ ³ªÅ¸³ª¸ç, ÁúÀǺκÐ(where Àý)¿¡´Â ³ªÅ¸³ªÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾îº¸ÀÚ. SELECT max(temp_lo) FROM weather; Àüü ÇÔ¼ö¿Í ÇÔ²² 'GROUP BY' ÀýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. SELECT city, max(temp_lo) FROM weather GROUP BY city; #59 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (5) 08/12 20:40 198 line 5. Áøº¸ÀûÀÎ POSTGRES SQL ÀÇ Æ¯Â¡ ÀÌÁ¦ ±âº»ÀûÀÎ µ¥ÀÌÅÍ °ü¸®¿Í´Â ±¸º°µÇ´Â POSTGRES ÀÇ Æ¯Â¡¿¡ ´ëÇؼ­ ³íÀÇÇØ º¼ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Æ¯Â¡¿¡´Â »ó¼Ó, ½Ã°£ ¿©Çà, ºñ¿øÀÚÈ­ µ¥ÀÌÅÍ °ªµé (array- ¿Í set-valued ¼Ó¼º) µîÀÌ ÀÖ´Ù. ÀÌÀå¿¡¼­ ³ª¿À´Â ¿¹´Â ±³Àç(tutorial) µð·ºÅ丮¿¡ 'advance.sql' ¿¡ ³ª¿ÍÀÖ´Ù. (ÀÌ°ÍÀ» ¾î¶»°Ô »ç¿ëÇÏ´Â Áö´Â ¾ÕÀåÀÇ ¼­·Ð ºÎºÐÀ» ÂüÁ¶ÇÏÀÚ.) 5.1 »ó¼Ó µÎ°³ÀÇ Å¬·¡½º¸¦ ¸¸µé¾î º¸ÀÚ. 'capitals' Ŭ·¡½º´Â ÇϳªÀÇ µµ½Ã, ÁÖÀÇ ¼öµµ ¸¦ Æ÷ÇÔÇÑ´Ù. ÀÚ¿¬½º·´°Ô, 'capitals' Ŭ·¡½º´Â 'cities' ·ÎºÎÅÍ »ó¼Ó¹Þ¾Æ¾ß ÇÑ ´Ù. CREATE TABLE cities ( name text, population float, altitude int -- (in ft) ); CREATE TABLE capitals ( state char2 ) INHERITS (cities); ÀÌ °æ¿ì¿¡, 'capitals' ÀÇ ÀνºÅϽº´Â ±×ÀÇ ºÎ¸ð·ÎºÎÅÍ ¸ðµç ¼Ó¼º ('name', 'population', 'altitude') ¸¦ »ó¼Ó¹Þ´Â´Ù. ¼Ó¼º 'name' ÀÇ Å¸ÀÔÀº 'text' ÀÌ´Ù. 'text' ´Â °¡º¯ ±æÀÌÀÇ ¾Æ½ºÅ° ¹®ÀÚ¿­¿¡ »ç¿ëµÇ´Â POSTGRES ¿¡ ³»ÀåµÇ¾î Àִ ŸÀÔ ÀÌ´Ù. ¼Ó¼º 'population' ÀÇ Å¸ÀÔÀº 'float4' À̸ç, ÀÌ Å¸ÀÔÀº ´õºí Á¤¹ÐµµÀÇ ºÎµ¿ ¼Ò¼ö¿¡ »ç¿ëµÇ´Â POSTGRES ³»ÀåÇüÀÌ´Ù. ÁÖÀÇ ¼öµµ(state capitals)´Â ¶Ç´Ù¸¥ ¼Ó¼ºÀ¸·Î ÁÖ¸¦ ³ªÅ¸³»´Â 'state' ¸¦ °¡Áö°í ÀÖ´Ù. POSTGRES ¿¡¼­, ÇϳªÀÇ Å¬·¡ ½º´Â 0°³ ÀÌ»óÀÇ Å¬·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ°í,(ÁÖ4)ÇϳªÀÇ ÁúÀÇ´Â ¾î¶² Ŭ·¡½ºÀÇ ¸ðµç ÀνºÅϽº³ª ÀÌ°Í°ú ÇÔ²² ÀνºÅϽºÀÇ ÀÚ¼Õ±îÁö ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ¾Æ·¡ÀÇ ÁúÀÇ´Â °íµµ 500 ÇÇÆ® º¸´Ù ³ôÀº °÷¿¡ ÀÖ´Â µµ½Ã¸¦ °Ë»öÇÏ´Â °ÍÀÌ´Ù. ÁÖ4) »ó¼Óü°è´Â ¹Ù·Î acyclic ±×·¡ÇÁÀÌ´Ù. SELECT name, altitude FROM cities WHERE altitude > 500; name |altitude ---------+-------- Las Vegas| 2174 Mariposa | 1953 (2 rows) 500 ÇÇÆ® ÀÌ»ó¿¡ ÀÖ´Â ¸ðµç µµ½Ã¸¦ ÁÖÀÇ ¼öµµ¸¦ Æ÷ÇÔÇÏ¿© ã°íÀÚ ÇÑ´Ù¸é, ÇØ´ç ÁúÀÇ´Â ´ÙÀ½°ú °°´Ù. SELECT c.name, c.altitude FROM cities* c WHERE c.altitude > 500; °á°ú´Â ´ÙÀ½°ú °°´Ù. name |altitude ---------+-------- Las Vegas| 2174 Mariposa | 1953 Madison | 845 (3 rows) 'cities' ´ÙÀ½ÀÇ '*' ´Â 'cities' ¿Í 'cities' ¿¡¼­ »ó¼Ó¹ÞÀº ¸ðµç Ŭ·¡½º¸¦ ³ªÅ¸ ³½´Ù. ÀÌ¹Ì ¾Õ¿¡¼­ »ìÆ캻 ¸¹Àº ¸í·É - select, update, delete - Àº 'alter' ¸í·É °ú À¯»çÇÑ ÀÌ·¯ÇÑ '*' Ç¥±â¸¦ Á¦°øÇÑ´Ù. 5.2 ½Ã°£ ¿©Çà POSTGRES ´Â ½Ã°£ ¿©Çà¿¡ ´ëÇÑ Ç¥±â¹ýÀ» Áö¿øÇÑ´Ù. ÀÌ·¯ÇÑ Æ¯Â¡Àº »ç¿ëÀÚ·Î ÇÏ¿©±Ý ¿ª»çÀûÀÎ ÁúÀǸ¦ ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¿¹¸¦ µé¸é, Mariposa µµ½ÃÀÇ ÇöÀçÀÇ Àα¸¸¦ °Ë»öÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. SELECT * FROM cities WHERE name = 'Mariposa'; name |population|altitude --------+----------+-------- Mariposa| 1320| 1953 (1 row) POSTGRES ´Â ÀÚµ¿ÀûÀ¸·Î ÇöÀç ½ËÁ¡¿¡¼­ÀÇ À¯È¿ÇÑ Mariposa µµ½ÃÀÇ ·¹Äڵ带 ãÀ» °Í ÀÌ´Ù. ¿©±â¿¡¼­ ½Ã°£¹üÀ§¸¦ ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. Mariposa µµ½ÃÀÇ °ú°ÅÀÇ Àα¸¸¦ ¾Ë¾Æº¸·Á¸é, ´ÙÀ½°ú °°ÀÌ ÁúÀÇÇÏ¸é µÈ´Ù. SELECT name, population FROM cities['epoch', 'now'] WHERE name = 'Mariposa'; 'epoch' ´Â ½Ã½ºÅÛ ½Ã°£ÀÇ ½ÃÀÛ½ËÁ¡À» ³ªÅ¸³½´Ù. (ÁÖ5) Áö±Ý±îÁöÀÇ ¸ðµç ¿¹Á¦¸¦ ½Ç Çà½ÃÄ×´Ù¸é, ÁúÀÇÀÇ °á°ú´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù. ÁÖ5) UNIX ½Ã½ºÅÛ¿¡¼­´Â, ÀÌ ½ËÁ¡Àº Ç×»ó1970 GMT 1¿ù 1ÀÏ 00½ÃÀÌ´Ù. name |population --------+---------- Mariposa| 1200 Mariposa| 1320 (2 row) ½Ã°£¹üÀ§¿¡¼­ µðÆúÆ® ½ÃÀÛ½ËÁ¡Àº ½Ã½ºÅÛÀÌ ½Ã°£À» Ç¥½ÃÇÒ ¼ö ÀÖ´Â ÃÖÃÊÀÇ ½Ã°¢À̸ç, µðÆúÆ® ³¡ÁöÁ¡Àº ÇöÀç ½Ã°¢ÀÌ´Ù. µû¶ó¼­, À§ÀÇ ½Ã°£¹üÀ§´Â "[,]." ¿Í °°ÀÌ ´ÜÃàÇÏ ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù. 5.3 ¿øÀÚÈ­µÇÁö ¾ÊÀº °ª °ü°èÇü ¸ðµ¨¿¡¼­ÀÇ °ü°èÀÇ ¼Ó¼ºÀº º¸Åë ¿øÀÚÈ­(atomic)µÈ´Ù´Â °ÍÀÌ´Ù. POSTGRES ¿¡´Â ÀÌ·¯ÇÑ Á¦ÇÑÀÌ ¾ø´Ù. ¼Ó¼ºÀº ÁúÀǾî·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â º¸Á¶°ª(sub-values) À» °¡Áú ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, ÇϳªÀÇ ¼Ó¼ºÀ» ±âº» ŸÀÔÀÇ ¹è¿­·Î ¸¸µé ¼ö ÀÖ ´Ù. 5.3.1 ¹è¿­ POSTGRES ¿¡¼­´Â ÇϳªÀÇ ÀνºÅϽºÀÇ ¼Ó¼ºÀº °íÁ¤±æÀÌ ¶Ç´Â °¡º¯±æÀÌÀÇ ´ÙÂ÷¿ø ¹è¿­ ·Î Á¤ÀÇ µÉ ¼ö ÀÖ´Ù. ¾î¶°ÇÑ ±âº»ÇüÀ̳ª »ç¿ëÀÚ Á¤ÀÇÇüÀÇ ¹è¿­µµ ¸¸µé ¼ö ÀÖ´Ù. ½Ç·Ê¸¦ º¸À̱â À§ÇØ, ¿©±â¼­´Â ¸ÕÀú ±âº»ÇüÀÇ ¹è¿­À» »ç¿ëÇÏ¿© Ŭ·¡½º¸¦ ¸¸µé¾î º¸ °Ú´Ù. CREATE TABLE SAL_EMP ( name text, pay_by_quarter int4[], schedule char16[][] ); À§ÀÇ ÁúÀÇ´Â SAL_EMP ·Î ºÒ¸®¿ì´Â Ŭ·¡½º¸¦, text ¹®ÀÚ¿­('name')°ú int4ÀÇ 1Â÷¿ø ¹è¿­('pay_by_quarter'), ±×¸®°í char16 ÀÇ 2Â÷¿ø ¹è¿­('schedule')ÀÇ ±¸¼ºÀ¸·Î »ý ¼ºÇÑ´Ù. 'pay_by_quarter' ´Â »ç¿øµé¿¡°Ô Áö±ÞµÇ´Â 4µîºÐµÈ ±Þ·áÀ̸ç, 'schedule' ´Â »ç¿øµéÀÇ ÁÖ°£°èȹÀÌ´Ù. ÀÌÁ¦ µ¥ÀÌÅ͸¦ Á¶±Ý »ðÀÔÇغ¸ÀÚ. ¹è¿­¿¡ µ¥ÀÌÅ͸¦ Ãß°¡ÇÒ ¶§´Â, ÇØ´ç°ªÀº Áß°ýÈ£ »çÀÌ¿¡ ¿Í¾ß ÇÏ°í, ÄÞ¸¶¿¡ ÀÇÇØ ±¸ºÐµÈ´Ù. C ¸¦ ¾Ë°í ÀÖ´Ù¸é, ±¸Á¶Ã¼ÀÇ ÃʱâÈ­ ¹®¹ý°ú º°·Î ´Ù¸£Áö ¾Ê´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. INSERT INTO SAL_EMP VALUES ('Bill', '{10000, 10000, 10000, 10000}', '{{"meeting", "lunch"}, {}}'); INSERT INTO SAL_EMP VALUES ('Carol', '{20000, 25000, 25000, 25000}', '{{"talk", "consult"}, {"meeting"}}'); POSTGRES ¿¡¼­´Â ±âº»ÀûÀ¸·Î ¹è¿­¿¡¼­ ¹øÈ£¸¦ ºÙÀÏ ¶§ 1ºÎÅÍ ½ÃÀÛÇÑ´Ù. n °³ÀÇ ¿ø¼Ò¸¦ °¡Áø ¹è¿­Àº ¹è¿­[1] ¿¡¼­ ½ÃÀÛÇÏ¿© ¹è¿­[n]À¸·Î ³¡³­´Ù. ÀÌÁ¦, SAL_EMP ¿¡ ¸î°³ÀÇ ÁúÀǸ¦ ´øÁ®º¸ÀÚ. ¸ÕÀú, ¾î´À ÇÑ ½ËÁ¡¿¡¼­ ¹è¿­Áß Çϳª ÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ. ´ÙÀ½ÀÇ ÁúÀÇ´Â »ç¿øµé Áß ±Þ·áÀÇ µÎ¹ø° ¹è´ç±ÝÀÌ º¯°æµÈ »ç¶÷À» °Ë»öÇÑ´Ù. SELECT name FROM SAL_EMP WHERE SAL_EMP.pay_by_quarter[1] <> SAL_EMP.pay_by_quarter[2]; name ----- Carol (1 row) ´ÙÀ½ÀÇ ÁúÀÇ´Â ¸ðµç »ç¿øµéÀÇ ±Þ·áÁß ¼¼¹ø° ¹è´ç±ÝÀ» º¸¿©ÁØ´Ù. SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP; pay_by_quarter -------------- 10000 25000 (2 rows) POSTGRES ¿¡¼­´Â ¹è¿­ÀÇ Á¶°¢(slices), ¶Ç´Â º¸Á¶¹è¿­(subarrays)¿¡ Á¢±ÙÇÒ ¼ö ÀÖ ´Ù. ´ÙÀ½ÀÇ ÁúÀÇ´Â Bill ÀÇ ÁÖ°£°èȹ¿¡¼­ óÀ½ µÎ¹ø°³¯ÀÇ Ã¹¹ø° ¾ÆÀÌÅÛÀ» °Ë »öÇÑ´Ù. SELECT SAL_EMP.schedule[1:2][1:1] FROM SAL_EMP WHERE SAL_EMP.name = 'Bill'; schedule ------------------ {{"meeting"},{""}} (1 row) #60 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (6) 08/13 02:34 121 line 6. È®Àå SQL : ¹Ì¸®º¸±â ´ÙÀ½ÀåºÎÅÍ, ´ÙÀ½ÀÇ ³»¿ëÀ» Ãß°¡ÇÏ¿© POSTGRES SQL ÁúÀǾ È®ÀåÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¾Ë¾Æº¼ °ÍÀÌ´Ù. * ÇÔ¼ö (functions) * Çü (types) * ¿ÀÆÛ·¹ÀÌÅÍ (operators) * ÇÕ°è (aggregates) 6.1 È®ÀåÀº ¾î¶»°Ô ÀÛµ¿Çϳª POSTGRES ´Â ±× ÀÛµ¿ÀÌ Ä«Å»·Î±× ¿î¿µ(catalog-driven)¹æ½ÄÀ̱⠶§¹®¿¡ È®Àå°¡´ÉÇÏ ´Ù. ¿©·¯ºÐµéÀÌ Ç¥ÁØ °ü°èÇü ½Ã½ºÅÛ¿¡ Ä£¼÷ÇÏ´Ù¸é, °ü°èÇü ½Ã½ºÅÛ¿¡¼­´Â µ¥ÀÌÅÍ º£À̽º¿Í Å×À̺í, Ä÷³ µî¿¡ °ü·ÃµÈ Á¤º¸¸¦ ½Ã½ºÅÛ Ä«Å»·Î±×¶ó°í ºÒ¸®¿ì´Â °÷¿¡ ÀúÀåÇÔÀ» Àß ¾Ë°ÍÀÌ´Ù. (¾î¶² ½Ã½ºÅÛ¿¡¼­´Â ÀÌ°ÍÀ» µ¥ÀÌÅÍ »çÀü (data dictionary) ¶ó°í ºÎ¸¥´Ù.) Ä«Å»·Î±×´Â »ç¿ëÀÚ¿¡°Ô´Â ´Ù¸¥ °Í°ú ¸¶Âù°¡Áö·Î Ŭ·¡½º·Î Ç¥ÇöµÇ ³ª, DBMS ´Â ³»ºÎÀåºÎ¸¦ Ä«Å»·Î±× ¾È¿¡ ÀúÀåÇÑ´Ù. ´Ù¸¥ Ç¥ÁØ °ü°èÇü ½Ã½ºÅÛ°ú POSTGRES °¡ ´Ù¸¥ Á¡Àº POSTGRES ´Â Ä«Å»·Î±× ³»ºÎ¿¡ Á» ´õ ¸¹Àº Á¤º¸¸¦ ÀúÀåÇÑ´Ù ´Â Á¡ÀÌ´Ù. ÀúÀåµÇ´Â Á¤º¸´Â Å×À̺í°ú Ä÷³¿¡ °ü·ÃµÈ Á¤º¸ »Ó¸¸ÀÌ ¾Æ´Ï¶ó, Çü (types), ÇÔ¼ö(functions), Á¢±Ù ¹æ¹ý(access methods) µîµî¿¡ °üÇÑ Á¤º¸µµ Æ÷ÇÔµÈ ´Ù. ½Ã½ºÅÛ Ä«Å»·Î±×¿¡ °ü·ÃµÈ Ŭ·¡½º´Â »ç¿ëÀÚ°¡ º¯°æÇÒ ¼ö ÀÖÀ¸¸ç, POSTGRES ÀÇ ³»ºÎÀûÀÎ ÀÛµ¿Àº ÀÌ·¯ÇÑ Å¬·¡½º¿¡ ±â¹ÝÇÑ´Ù. ÀÌ Àǹ̴ »ç¿ëÀÚ°¡ POSTGRES ¸¦ È® ÀåÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ºñ±³¸¦ ÇÏÀÚ¸é, ÀüÅëÀûÀÎ µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛÀº DBMS ³» ºÎÀÇ ÇϵåÄÚµåµÈ ÇÁ·Î½ÃÀú¸¦ º¯°æÇϰųª, DBMS °ø±ÞÀÚ°¡ Ưº°È÷ Á¦ÀÛÇÑ ¸ðµâÀ» Àû ÀçÇÔÀ¸·Î½á¸¸ È®Àå°¡´ÉÇØÁø´Ù. POSTGRES ´Â ´Ù¸¥ ´ëºÎºÐÀÇ µ¥ÀÌÅÍ °ü¸®ÀÚ¿Í´Â ´Þ¸®, »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ Äڵ带 DBMS ³»ºÎ·Î µ¿Àû ÀûÀç(dynamic loading)¸¦ ÅëÇؼ­ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. »ç¿ëÀÚ´Â ÀûÀç½Ã¿¡ »õ·Î¿î Çü(type)°ú ÇÔ¼ö°¡ Á¤ÀÇµÈ ¿ÀºêÁ§Æ® ÄÚµå ÆÄÀÏ (ÄÄÆÄÀÏµÈ .oÆÄÀÏ, ¶Ç´Â °øÀ¯ ¶óÀ̺귯¸®) ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç, POSTGRES ´Â ¿äû ´ë·Î ÀûÀçÇÒ °ÍÀÌ´Ù. SQL·Î ÀÛ¼ºµÈ ÄÚµå´Â ´õ¿í ½±°Ô DBMS ¼­¹ö¿¡ Ãß°¡µÉ ¼ö ÀÖ´Ù. POSTGRES ÀÇ ÀÌ·¯ÇÑ ¼öÁ¤ ´É·ÂÀº Ưº°È÷ »õ·Î¿î ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ½Å¼ÓÇÑ ¿øÇüÀÛ¼º °ú ÀúÀ屸Á¶¿¡ ÀûÇÕÇÏ´Ù. 6.2 POSTGRES Çü(type) ½Ã½ºÅÛ POSTGRES Çü ½Ã½ºÅÛÀº ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ¹«·ÂÈ­ ½Ãų ¼ö ÀÖ´Ù. Çü(type)Àº ±âº»(base)Çü°ú º¹ÇÕ(composite)ÇüÀ¸·Î ³ª´­ ¼ö ÀÖ´Ù. ±âº»ÇüÀº int4 ¿Í °°ÀÌ, C ¿Í °°Àº ¾ð¾î¿¡¼­ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. ±âº»ÇüÀº º¸Åë "ÀÌ·ÐÀûÀÎ (abstract) µ¥ÀÌÅÍ Çü"À¸·Î ¾Ë·ÁÁø °Íµé°ú ÀÏÄ¡ÇÑ´Ù. POSTGRES ´Â »ç¿ëÀÚ°¡ Á¦°øÇÑ ¹æ¹ýÀ» ÅëÇØ ±âº»Çü À§¿¡¼­¸¸ ÀÛµ¿ÇÒ ¼ö ÀÖÀ¸¸ç, ±âº»ÇüÀÇ ÇൿÀ» »ç¿ëÀÚ°¡ ±â¼úÇÑ È®ÀåÀ¸·Î¸¸ ÀÌÇØÇÑ´Ù. º¹ÇÕÇüÀº »ç¿ëÀÚ°¡ Ŭ·¡½º¸¦ ¸¸µé¶§ »ý¼ºµÈ´Ù. 'EMP' ´Â º¹ÇÕÇüÀÇ ÇϳªÀÇ ¿¹ÀÌ´Ù. POSTGRES ´Â º¹ÇÕÇüÀ», Ŭ·¡½ºÀÇ ¸ðµç ÀνºÅϽº µéÀÌ ÀúÀåµÈ ÆÄÀÏ ³»ºÎÀÇ ÇÑ°÷¿¡¸¸ ÀúÀåÇÏÁö¸¸, »ç¿ëÀÚ´Â ÁúÀǾ »ç¿ëÇÏ¿© º¹ÇÕ ÇüÀÇ ¼Ó¼ººÎºÐ¿¡¼­ ³»ºÎ¸¦ µé¿©´Ù º¼ ¼ö ÀÖ´Ù. ¾Æ¿ï·¯ ÇØ´ç ¼Ó¼º¿¡¼­ (¿¹¸¦ µéÀÚ¸é) À妽º¸¦ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ¸·Î º¹±¸¸¦ ÃÖÀûÈ­ÇÒ ¼ö ÀÖ´Ù. ¾Æ¿ï·¯ POSTGRES ÀÇ ±âº»ÇüÀ» ³»Àå(built-in)Çü°ú »ç¿ëÀÚÁ¤ÀÇ(user-defined)ÇüÀ¸·Î ³ª´­¼ö ÀÖ´Ù. int4 ¿Í °°Àº ³»ÀåÇüÀº ½Ã½ºÅÛ»ó¿¡ ÄÄÆÄÀÏµÈ »óÅ·ΠÆ÷ÇԵǾî ÀÖ´Ù. »ç¿ëÀÚÁ¤ÀÇÇüÀº ¾Æ·¡¿¡¼­ ¼³¸íÇÏ´Â ¹æ¹ýÀ¸·Î »ç¿ëÀÚ°¡ ¸¸µç °ÍÀÌ´Ù. 6.3 POSTGRES ½Ã½ºÅÛ Ä«Å»·Î±× ÀÌÁ¦, Ä«Å»·Î±×ÀÇ ½ÇÁ¦ÀûÀÎ À±°ûÀ» »ìÆ캸¸é¼­, ±âº» È®À强 °³³ä¿¡ ÀÔ¹®Çغ¸ÀÚ. ÀÌÀåÀ» °Ç³Ê¶Ù´Â °ÍÀº ¿©·¯ºÐ ¸¶À½ÀÌÁö¸¸, µÞºÎºÐ¿¡¼­ ¿©±â¿¡ ³ª¿À´Â Áö½ÄÀÌ ²À ÇÊ ¿äÇϱ⠶§¹®¿¡ ³ªÁßÀ» À§Çؼ­¶óµµ ÀÌ ºÎºÐÀ» Ç¥½ÃÇصÎÀÚ. ½Ã½ºÅÛ Ä«Å»·Î±×ÀǸðµç ¸íĪÀº 'pg_' ·Î ½ÃÀÛÇÑ´Ù. ¾Æ·¡ÀÇ Å¬·¡½º´Â »ç¿ëÀÚ¿¡°Ô À¯¿ëÇÑ Á¤º¸ÀÌ´Ù. (´Ù¸¥ ½Ã½ºÅÛ Ä«Å»·Î±×µµ ¸¹ÀÌ ÀÖÀ¸³ª Á÷Á¢ ÁúÀÇ¿¡¼­ »ç¿ëÇÒ °æ¿ì´Â µå¹° °ÍÀÌ´Ù.) ---------------------------------------------------------------------- Ä«Å»·Î±× À̸§ ¼³¸í ====================================================================== pg_database µ¥ÀÌÅͺ£À̽º pg_class Ŭ·¡½º pg_attribute Ŭ·¡½º ¼Ó¼º pg_index µÎ¹ø°(º¸Á¶) À妽º pg_proc ÇÁ·Î½ÃÀú (C ¿Í SQL) pg_type Çü (±âº»Çü°ú º¹ÇÕÇü) pg_operator ¿ÀÆÛ·¹ÀÌÅÍ pg_aggregate ÁýÇÕ ¹× ÁýÇÕÇÔ¼ö pg_am ¿¢¼¼½º ¹æ¹ý pg_amop ¿¢¼¼½º ¹æ¹ý ¿ÀÆÛ·¹ÀÌÅÍ pg_amproc ¿¢¼¼½º ¹æ¹ý Á¦°ø ÇÔ¼ö pg_opclass ¿¢¼¼½º ¹æ¹ý ¿ÀÆÛ·¹ÀÌÅÍ Å¬·¡½º ---------------------------------------------------------------------- ·¹ÆÛ·±½º ¸Þ´º¾ó¿¡ ÀÌ·¯ÇÑ Ä«Å»·Î±×¿Í ¼Ó¼º¿¡ ´ëÇÑ Á» ´õ ÀÚ¼¼ÇÑ ¼³¸íÀÌ µé¾îÀÖ´Ù. ±×·¯³ª, ±×¸²3Àº ½Ã½ºÅÛ Ä«Å»·Î±×ÀÇ ÇÙ½É ½Çü¿Í ÀÌ·¯ÇÑ °ü°è¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ( ´Ù¸¥ ½Çü¸¦ ÂüÁ¶ÇÏÁö ¾Ê´Â ¼Ó¼ºÀº ÇØ´ç ¼Ó¼ºÀÌ ÇÁ¶óÀ̸Ӹ® Å°ÀÇ ÀϺκÐÀÌ ¾Æ´Ò °æ¿ì¿¡´Â ¿©±â¿¡¼­ ³ªÅ¸³ªÁö ¾Ê´Â´Ù.) ÀÌ µµÇ¥´Â ½ÇÁ¦·Î Ä«Å»·Î±×ÀÇ ³»¿ëÀ» º¸±â ÀüÀ̳ª ´Ù¸¥ °Íµé°úÀÇ »óÈ£°ü°è¸¦ »ìÆ캸±âÀü¿¡´Â ´Ù¼Ò°£ ÀÌÇØÇϱ⠾î·Á¿ï °ÍÀÌ´Ù. ÀÌ µµÇ¥¿¡¼­ Áß¿äÇÑ Á¡Àº ´ÙÀ½ °ú °°´Ù. (1) ÀÌÈÄÀÇ ¿©·¯Àå¿¡¼­, ½Ã½ºÅÛÀ» È®ÀåÇÏ´Â µ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ º¸¿©ÁÖ´Â ½Ã½ºÅÛ Ä«Å»·Î±×»ó¿¡¼­ ´Ù¾çÇÑ join ÁúÀǸ¦ º¸°Ô µÉ °ÍÀÌ´Ù. ÀÌ µµÇ¥¸¦ »ìÆ캸¸é¼­ Á» ´õ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï ÀÌ·¯ÇÑ join ÁúÀÇ(º¸Åë ¼¼°³³ª ³×°³ÀÇ join)¸¦ Á¶±Ý ¸¸µé¾îº¸´Â °Íµµ ÁÁÀ» °ÍÀÌ´Ù. ÁúÀÇ¿¡¼­ »ç¿ëµÈ ¼Ó¼ºÀÌ ´Ù¸¥ Ŭ·¡½º¿¡¼­´Â ¿ÜºÎ Å°ÀÇ ÇüŸ¦ ÀÌ·é´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. (2) ´Ù¸¥ ¸¹Àº Ư¡ (Ŭ·¡½º, ¼Ó¼º, ÇÔ¼ö, Çü, ¿¢¼¼½º ¹æ¹ý µî)µéµµ ÀÌ ½ºÄɸ¶ ¿¡¼­ ¼­·Î Çù·ÂÇÑ´Ù. 'create' ¸í·ÉÀ¸·Î °£´ÜÈ÷ ÀÌ·¯ÇÑ Ä«Å»·Î±×ÀÇ ¸¹Àº ºÎºÐÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. [±×¸² 3] POSTGRES ÀÇ ÇÙ½É ½Ã½ºÅÛ Ä«Å»·Î±× (3) ŸÀÔ°ú ÇÁ·Î½ÃÀú (ÁÖ6)´Â ÀÌ ½ºÄɸ¶ÀÇ Áß½ÉÀÌ´Ù. °ÅÀÇ ¸ðµç Ä«Å»·Î±×´Â ÀÌ·¯ÇÑ Å¬·¡½ºÀÇ Çϳª ¶Ç´Â ¾çÂÊ ¸ðµÎ¿¡ ÀÖ´Â ÀνºÅϽº¸¦ ÂüÁ¶ÇÑ´Ù. ¿¹¸¦ µéÀÚ¸é, POSTGRES ´Â ÀÚÁÖ ´Ù¸¥ Ä«Å»·Î±×ÀÇ À¯ÀÏÇÑ ÀνºÅϽº¸¦ ½Äº°Çϱâ À§ÇØ Çü ½Ã±×³×ÃÄ(ÇÔ¼ö¿Í ¿ÀÆÛ·¹ÀÌÅÍÀÇ)¸¦ »ç¿ëÇÑ´Ù. ÁÖ6) ¿©±â¼­´Â ´Ù¼Ò°£ÀÇ È£È¯¼ºÀ» À§ÇØ 'procedure(ÇÁ·Î½ÃÀú)'¿Í 'function(ÇÔ¼ö)' ¶ó´Â ´Ü¾î¸¦ »ç¿ëÇÑ´Ù. (4) ºÐ¸íÇÑ Àǹ̸¦ °¡Áö´Â ¸¹Àº ¼Ó¼º°ú °ü°è°¡ ÀÖÀ¸³ª, ±×·¸Áö ¾ÊÀº °Í(¿¢¼¼½º ¹æ¹ý °ú ÇÔ²² µ¿ÀÛÇϴ ƯÁ¤ÇÑ °Í) µµ ¸¹´Ù. 'pg_am', 'pg_amop', 'pg_amproc', 'pg_operator', 'pg_opclass' »çÀÌÀÇ °ü°è´Â ÀÌÇØÇϱⰡ ¸Å¿ì ±î´Ù·Ó±â ¶§¹®¿¡, ±âº»ÀûÀÎ È®Àå¿¡ ´ëÇØ ¾Ë¾Æº» µÚ¿¡ Á»´õ ½Éµµ±í°Ô (types°ú operators ¿¡ ´ëÇØ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÏ´Â Àå¿¡¼­) ¾Ë¾Æº¼ °ÍÀÌ´Ù. #62 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (7) 08/17 15:56 380 line 7. È®Àå SQL : ÇÔ¼ö ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀº »õ·Î¿î Çü(type)À» Á¤ÀÇÇÏ´Â °ÍÁß ÀϺκÐÀÌ´Ù. »õ·Î¿î Çü(type)À» Á¤ÀÇÇÏÁö ¾Ê°í ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀº °¡´ÉÇÏÁö¸¸, ±× ¿ªÀº ºÒ°¡´É ÇÏ´Ù. µû¶ó¼­ ¿©±â¼­´Â »õ·Î¿î Çü(type)À» Ãß°¡ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇϱ⿡ ¾Õ¼­ »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡ÇÏ´Â ¹æ¹ýºÎÅÍ ¸ÕÀú ¼³¸íÇÒ °ÍÀÌ´Ù. ÀÌÀå¿¡¼­ ³ª¿À´Â ¿¹Á¦µéÀº funcs.sql °ú C-code/funcs.c ¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. 7.1 ÁúÀǾî (SQL) ÇÔ¼ö 7.1.1 ±âº»Çü SQL ÇÔ¼ö °¡Àå °£´ÜÇÑ SQL ÇÔ¼ö´Â ¸Å°³ÀÎÀÚ´Â ¾ø°í, int4 ¿Í °°Àº ±âº»ÇüÀ» ¹ÝȯÇÏ´Â °ÍÀÌ ¾Æ´Ò±î? CREATE FUNCTION one() RETURNS int4 AS 'SELECT 1 as RESULT' LANGUAGE 'sql'; SELECT one() AS answer; answer ------ 1 ¿©±â¿¡¼­ ´ë»ó ¸®½ºÆ®¸¦ RESULT ¶ó´Â À̸§À¸·Î ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇÇÏ¿´À¸³ª, ÇÔ¼ö¸¦ ºÒ·¯¿À´Â ÁúÀÇ¿¡¼­ÀÇ ´ë»ó ¸®½ºÆ®´Â ÇÔ¼öÀÇ ´ë»ó ¸®½ºÆ®¸¦ ¹«È¿È­ÇÑ´Ù. µû¶ó¼­, ±× °á°ú¿¡´Â one ´ë½Å answer À̶ó´Â À̸§ÀÇ ¶óº§ÀÌ ºÙ´Â´Ù. ÀÌÁ¦ ¸Å°³ÀÎÀÚ·Î ±âº»ÇüÀ» °¡Áö´Â SQL ÇÔ¼ö¸¦ Á¤ÀÇÇغ¸ÀÚ. ¾Æ·¡ÀÇ ¿¹¿¡¼­, ÇÔ¼ö³» ºÎ¿¡¼­ ¸Å°³ÀÎÀÚ¸¦ ÂüÁ¶ÇÒ ¶§´Â $1, $2 ¿Í °°ÀÌ »ç¿ëÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇ϶ó. CREATE FUNCTION add_em(int4, int4) RETURNS int4 AS 'SELECT $1 + $2;' LANGUAGE 'sql'; SELECT add_em(1, 2) AS answer; answer ------ 3 7.1.2 º¹ÇÕÇü SQL ÇÔ¼ö ÇÔ¼ö¿¡¼­ÀÇ ¸Å°³ÀÎÀÚ°¡ º¹ÇÕÇü (EMP ó·³)ÀÏ °æ¿ì¿¡´Â, ¿øÇÏ´Â (À§¿¡¼­ $1, $2 ¶ó°í Çß´ø °Íó·³) ÀÎÀÚ¸¦ ¸í½Ã¸¸ Çؼ­´Â ¾ÈµÇ°í ÀÎÀÚÀÇ ¼Ó¼º±îÁö ¸í½ÃÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, »ç¿øÀÇ ±Þ·á¸¦ µÎ¹è·Î °è»êÇÏ´Â double_salary ÇÔ¼ö¸¦ »ìÆ캸ÀÚ. CREATE FUNCTION double_salary(EMP) RETURNS int4 AS 'SELECT $1.salary * 2 AS salary;' LANGUAGE 'sql'; SELECT name, double_salary(EMP) AS dream FROM EMP WHERE EMP.dept = 'toy'; name|dream ----+----- Sam | 2400 $1.salary ¹®¹ýÀÇ »ç¿ë¿¡ ÁÖÀÇÇÏÀÚ. º¹ÇÕÇüÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö·Î µé¾î°¡±â Àü¿¡, ¸ÕÀú ¼Ó¼º°ú °ü·ÃµÈ ÇÔ¼ö½Ä Ç¥±â¹ýºÎÅÍ ¾Ë ¾Æº¸ÀÚ. ÀÌ·¯ÇÑ Ç¥±â¹æ½Ä¿¡´Â attribute(class) ¿Í class.attribute ÀÇ µÎ°¡Áö°¡ ÀÖÀ¸¸ç ¼­·Î ¹Ù²Ù¾î »ç¿ëÇÒ ¼ö ÀÖ´Ù. -- -- ÀÌ°ÍÀº ´ÙÀ½ÀÇ »ç¿ë°ú µ¿ÀÏÇÏ´Ù: -- SELECT EMP.name AS youngster FROM EMP WHERE EMP.age < 30 -- SELECT name(EMP) AS youngster FROM EMP WHERE age(EMP) < 30; youngster --------- Sam °á°ú°¡ Ç×»ó ÀÌ¿Í °°Áö´Â ¾Ê´Ù. ÀÌ ÇÔ¼ö½Ä Ç¥±â¹ýÀº ÇϳªÀÇ ÀνºÅϽº¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§ Áß¿äÇÏ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷Àº ÇÔ¼ö³»ÀÇ Àüü ÀνºÅϽº¸¦ ¼Ó¼ºÀ» Çϳª¾¿ ²ø¾î¸ðÀ½À¸·Î½á ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÇϳªÀÇ EMP ÀνºÅϽº¸¦ ¹ÝȯÇÏ´Â ÇÔ¼öÀÇ ¿¹ÀÌ´Ù. CREATE FUNCTION new_emp() RETURNS EMP AS 'SELECT \'None\'::text AS name, 1000 AS salary, 25 AS age, \'none\'::char16 AS dept;' LANGUAGE 'sql'; ¿©±â¼­´Â °¢°¢ÀÇ ¼Ó¼ºÀ» »ó¼ö°ªÀ¸·Î ÁöÁ¤ÇÏ¿´À¸³ª, ¾î¶°ÇÑ °è»ê°ªÀ̳ª Ç¥Çö½Äµµ ÀÌ·¯ÇÑ »ó¼ö°ªÀ» ´ëüÇÒ ¼ö ÀÖ´Ù. ÀÌ¿Í °°ÀÌ ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °ÍÀº ÀÏÁ¾ÀÇ Æ®¸¯ÀÏ °ÍÀÌ´Ù. ¸î°¡Áö ÁÖÀÇÇؾßÇÒ Áß¿ä ÇÑ »çÇ×Àº ´ÙÀ½°ú °°´Ù. * ´ë»ó ¸®½ºÆ®ÀÇ ¼ø¼­´Â CREATE TABLE ±¸¹®¿¡ ³ªÅ¸³ª´Â ¼Ó¼ºÀÇ ¼ø¼­¿Í Á¤È®È÷ ÀÏÄ¡ ÇØ¾ß ÇÑ´Ù. * Ç¥Çö½ÄÀ» '::' ¸¦ »ç¿ëÇÏ¿© Çüº¯È¯ ÇÒ ¶§¿¡´Â ¸Å¿ì Á¶½ÉÇØ¾ß Çϸç, ±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â ´ÙÀ½°ú °°Àº ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. WARN::function declared to return type EMP does not retrieve (EMP.*) * ÇϳªÀÇ ÀνºÅϽº¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§, ¼Ó¼º Àüü¸¦ ȸ¼öÇÒ ¼ö´Â ¾ø´Ù. ÀÌ°æ¿ì ÀνºÅϽº Áß ÇϳªÀÇ ¼Ó¼º¸¸À» ȸ¼öÇϰųª Àüü ÀνºÅϽº¸¦ ¶Ç´Ù¸¥ ÇÔ¼ö ·Î ³Ñ±æ ¼ö ÀÖ´Ù. SELECT name(new_emp()) AS nobody; nobody ------ None * ÇÔ¼ö¿¡¼­ÀÇ ¹Ýȯ°ª¿¡¼­ ¼Ó¼ºÀ» ÃëÇÒ ¶§´Â ¹Ýµå½Ã ÇÔ¼ö½Ä Ç¥±â¹ýÀ» »ç¿ëÇØ¾ß ÇÏ´Â µ¥, ±× ÀÌÀ¯´Â ÇÔ¼öÈ£ÃâÀ» °áÇÕÇؼ­ »ç¿ëÇÒ ¶§ Æļ­´Â Á¡('.')ÀÌ ºÙÀº ´Ù¸¥ ¹®¹ý À» ÀÌÇØÇÏÁö ¸øÇϱ⠶§¹®ÀÌ´Ù. SELECT new_emp().name AS nobody; WARN:parser: syntax error at or near "." SQL ÁúÀǾ¼­ ¾î¶°ÇÑ ¸í·ÉÀÇ Á¶ÇÕµµ ÇÔ²² ¹­À» ¼ö ÀÖÀ¸¸ç ÇÔ¼ö·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. SQL ·Î ÀÛ¼ºµÇ´Â ÇÔ¼ö¿¡¼­ select ÁúÀÇ¿Í ¸¶Âù°¡Áö·Î °»½Å(insert, update, delete µî) ¸í·ÉÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, ¸¶Áö¸· ¸í·ÉÀº ¹Ýµå½Ã select ¿©¾ß Çϸç, ÇÔ¼öÀÇ returntype À¸·Î ÁöÁ¤µÈ ¾î¶°ÇÑ °ªÀ» ¹ÝȯÇÏ¿©¾ß ÇÑ´Ù. CREATE FUNCTION clean_EMP () RETURNS int4 AS 'DELETE FROM EMP WHERE EMP.salary <= 0; SELECT 1 AS ignore_this' LANGUAGE'sql'; SELECT clean_EMP(); x - 1 7.2 ÇÁ·Î±×·¡¹Ö ¾ð¾î ÇÔ¼ö 7.2.1 ±âº»Çü ÇÁ·Î±×·¡¹Ö ¾ð¾î ÇÔ¼ö POSTGRES ´Â ³»ºÎÀûÀ¸·Î ±âº»ÇüÀ» ¸Þ¸ð¸®ÀÇ ÆÄÆíÀ¸·Î ÀνÄÇÑ´Ù. ÇϳªÀÇ ÇüÀ» ³Ñ¾î Á¤ÀÇÇÑ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö´Â POSTGRES ÇÔ¼ö»ó¿¡¼­ ÀÛµ¿ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. POSTGRES ´Â ÇÔ¼ö¸¦ ÀúÀåÇÏ°í µð½ºÅ©¿¡¼­ Àоî¿Ã »ÓÀ̸ç, µ¥ÀÌÅÍ ÀÔ·Â. ó¸®.Ãâ·ÂÀ» À§ÇØ »ç¿ëÀÚ Á¤ÀÇÇÔ¼ö¸¦ »ç¿ëÇÒ »ÓÀÌ´Ù. ±âº»ÇüÀº ´ÙÀ½ÀÇ ¼¼°¡Áö ³»ºÎÀûÀÎ Çü½ÄÁß Çϳª¸¦ °¡Áú ¼ö ÀÖ´Ù. * °ª¿¡ ÀÇÇÑ Àü´Þ, °íÁ¤±æÀÌ * ÂüÁ¶¿¡ ÀÇÇÑ Àü´Þ, °íÁ¤±æÀÌ * ÂüÁ¶¿¡ ÀÇÇÑ Àü´Þ, °¡º¯±æÀÌ °ª¿¡ ÀÇÇÑ Çü(type)Àº »ç¿ëÀÚÀÇ ÄÄÇ»ÅÍ°¡ ´Ù¸¥ Å©±âÀÇ º¯¼ö ÇüŸ¦ Á¦°øÇÑ´Ù ÇÒÁö ¶óµµ, ±× ±æÀÌ´Â 1,2,4 ¹ÙÀÌÆ®¸¸ µÉ ¼ö ÀÖ´Ù. POSTGRES ´Â ±×ÀÚü·Î´Â °ª¿¡ ÀÇÇÑ Àü´Þ¹æ½ÄÀ¸·Î Á¤¼öÇü¸¸ ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù. »õ·Î¿î Çü(type)À» Á¤ÀÇÇÒ ¶§´Â ¸ðµç ¾Æ Å°ÅØÃÄ¿¡¼­ °°Àº Å©±â(¹ÙÀÌÆ®¼ö·Î)°¡ µÇ¾î¾ß ÇÑ´Ù´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé ¾î, long ÇüÀº À§ÇèÇѵ¥, ±× ÀÌÀ¯´Â int ÇüÀÌ 4¹ÙÀÌÆ®ÀÎ ´ëºÎºÐÀÇ À¯´Ð½º ¸Ó½®»ó¿¡ ÀÇ ¾î¶°ÇÑ ¸Ó½®¿¡¼­´Â 4¹ÙÀÌÆ®ÀÌ°í ´Ù¸¥ ¸Ó½®¿¡¼­´Â 8¹ÙÀÌÆ®°¡ µÉ ¼ö Àֱ⠶§¹®ÀÌ ´Ù (´ë°³ÀÇ PC ¿¡¼­´Â ±×·¸Áö ¾Ê°ÚÁö¸¸). À¯´Ð½º ¸Ó½®»ó¿¡¼­ int4´Â ´ÙÀ½°ú °°´Ù. /* 4-byte integer, passwd by value */ typedef int int4; ±×¿ÜÀÇ °æ¿ì¿¡, °íÁ¤±æÀÌ ÇüÀº ÂüÁ¶¿¡ ÀÇÇÑ Àü´ÞÀÌ µÈ´Ù. ¿¹¸¦ µé¾î, POSTGRES ÀÇ char16 ÇüÀº ´ÙÀ½°ú °°´Ù. /* 16-byte structure, passed by reference */ typedef struct { char data[16]; } char16; char16°ú °°Àº ÇüÀ» POSTGRES ·Î ³Ñ°ÜÁְųª ¹ÞÀ» ¶§¿¡´Â ÀÌ Çü¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸¶Áö¸·À¸·Î, ¸ðµç °¡º¯±æÀÌ µ¥ÀÌÅÍ ÇüÀº ÂüÁ¶¿¡ ÀÇÇÑ Àü´ÞÀ̾î¾ß ÇÑ´Ù. ¾Æ¿ï·¯, ¸ðµç °¡º¯±æÀÌ µ¥ÀÌÅÍ ÇüÀº Á¤È®È÷ 4¹ÙÀÌÆ®ÀÇ ±æÀ̸¦ ³ªÅ¸³»´Â Çʵå·Î ½ÃÀ۵Ǿî¾ß Çϸç, ÇØ´ç µ¥ÀÌÅÍ Çü¿¡ ÀúÀåµÉ ¸ðµç µ¥ÀÌÅÍ´Â ±æÀÌÇ¥½Ã ÇÊµå ¹Ù·Î ´ÙÀ½ÀÇ ¸Þ¸ð¸® À§Ä¡»ó¿¡ ¿Àµµ·Ï ÇØ¾ß ÇÑ´Ù. ±æÀÌ Çʵå´Â ±æÀÌ ÇÊµå ±× ÀÚüÀÇ ±æÀ̸¦ Æ÷ÇÔÇÑ, ±¸Á¶Ã¼ ±æÀÌÀÇ ÇÕ°èÀÌ´Ù. 'text' µ¥ÀÌÅÍ ÇüÀ» ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. typedef struct { int4 length; char data[1]; } text; »ç½Ç, data Çʵå´Â °¡´ÉÇÑ ¸ðµç ¹®ÀÚ¿­À» ÀúÀåÇϱ⿡´Â ÃæºÐÇÏÁö ¾Ê´Ù -- C ¿¡¼­µµ ÀÌ·¯ÇÑ ÃæºÐÇÑ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. °¡º¯±æÀÌ µ¥ÀÌÅÍ ÇüÀ» ó¸®ÇÒ ¶§´Â, ÀûÀýÇÑ ¾çÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ±æÀÌ Çʵ带 ÃʱâÈ­ÇØ¾ß ÇÑ´Ù´Â Á¡¿¡ À¯ÀÇ ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, text ±¸Á¶Ã¼¿¡ 40¹ÙÀÌÆ®¸¦ ÀúÀåÇÏ·Á ÇÒ °æ¿ì, ´ÙÀ½°ú °°Àº ÇüŸ¦ ¶ç°Ô µÉ °ÍÀÌ´Ù. #include "postgres.h" #include "utils/palloc.h" ... char buffer[40]; /* our source data */ ... text *destination = (text *)palloc(VARHDRSZ + 40); destination->length = VARHDRSZ + 40; memmove(destination->data, buffer, 40); ... Áö±Ý±îÁö ±âº»Çü¿¡¼­ »ç¿ë°¡´ÉÇÑ ±¸Á¶¸¦ ¸ðµÎ »ìÆ캸¾Ò´Ù. ÀÌÁ¦ ½ÇÁ¦ ÇÔ¼öÀÇ ¿¹¸¦ Á¶±Ý »ìÆ캸µµ·Ï ÇÏÀÚ. C-code/funcs.c ÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù. #include #include "postgres.h" /* for char16, etc. */ #include "utils/palloc.h" /* for palloc */ int add_one(int arg) { return(arg + 1); } char16 * concat16(char16 *arg1, char16 *arg2) { char16 *new_c16 = (char16 *) palloc(sizeof(char16)); memset((void *) new_c16, 0, sizeof(char16)); (void) strncpy(new_c16, arg1, 16); return (char16 *)(strncat(new_c16, arg2, 16)); } text * copytext(text *t) { /* * VARSIZE is the total size of the struct in bytes. */ text *new_t = (text *) palloc(VARSIZE(t)); memset(new_t, 0, VARSIZE(t)); VARSIZE(new_t) = VARSIZE(t); /* * VARDATA is a pointer to the data region of the struct. */ memcpy((void *) VARDATA(new_t), /* destination */ (void *) VARDATA(t), /* source */ VARSIZE(t)-VARHDRSZ); /* how many bytes */ return (new_t); } OSF/1 ½Ã½ºÅÛ »ó¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ Å¸ÀÌÇÎÇÒ ¼ö ÀÖ´Ù. CREATE FUNCTION add_one(int4) RETURNS int4 AS '/usr/local/postgres95/tutorial/obj/funcs.so' LANGUAGE 'c'; CREATE FUNCTION concat16(char16, char16) RETURNS char16 AS '/usr/local/postgres95/tutorial/obj/funcs.so' LANGUAGE 'c'; CREATE FUNCTION copytext(text) RETURNS text AS '/usr/local/postgres95/tutorial/obj/funcs.so' LANGUAGE 'c'; ´Ù¸¥ ½Ã½ºÅÛ¿¡¼­´Â, ±×°ÍÀÌ °øÀ¯ ¶óÀ̺귯¸®¶ó´Â °ÍÀ» ³ªÅ¸³»±â À§ÇØ ¾Æ¸¶µµ ÆÄÀÏÀ̸§ÀÇ ³¡ÀÌ .sl ÀÌ µÇµµ·Ï ÇØ¾ß ÇÒ °ÍÀÌ´Ù 7.2.2 º¹ÇÕÇü ÇÁ·Î±×·¡¹Ö ¾ð¾î ÇÔ¼ö º¹ÇÕÇüÀº C ÀÇ ±¸Á¶Ã¼Ã³·³ °íÁ¤µÇ¾î ÀÖÁö´Â ¾Ê´Ù. º¹ÇÕÇüÀÇ ÀνºÅϽº´Â ³Î ÇÊµå ¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù. ¾Æ¿ï·¯, °èÃþÀûÀ¸·Î »ó¼ÓµÈ º¹ÇÕÇüÀº °èÃþÀûÀ¸·Î °°Àº »ó¼ÓÀ» ¹ÞÀº ´Ù¸¥ ¸â¹ö¿Í´Â ´Ù¸¥ Çʵ带 °¡Áú ¼ö ÀÖ´Ù. µû¶ó¼­, POSTGRES ´Â C ·ÎºÎÅÍ ¿¢¼¼½º ÇÏ´Â º¹ÇÕÇü Çʵ带 À§ÇØ ÇÁ·Î½ÃÁ® ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. POSTGRES °¡ ÀνºÅϽºÀÇ ÁýÇÕÀ» ó¸®ÇÏ´Â °Íó·³, °¢°¢ÀÇ ÀνºÅϽº´Â ºÒÅõ¸íÇÑ TUPLE Çü ±¸Á¶Ã¼·Î ÇÔ¼ö¿¡ ³Ñ°ÜÁú °ÍÀÌ´Ù. ¾î¶°ÇÑ ÁúÀǸ¦ ó¸®Çϱâ À§ÇØ ÇÔ¼ö¸¦ »ç¿ëÇÏ·Á ÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ. SELECT name, c_overpaid(EMP, 1500) AS overpaid FROM EMP WHERE name = 'Bill' or name = 'Sam'; À§ÀÇ ÁúÀÇ¿¡ ³ª¿À´Â c_overpaid ´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. #include "postgres.h" /* for char16, etc. */ #include "libpq-fe.h" /* for TUPLE */ bool c_overpaid(TUPLE t, /* the current instance of EMP */ int4 limit) { bool isnull = false; int4 salary; salary = (int4) GetAttributeByName(t, "salary", &isnull); if (isnull) return (false); return (salary > limit); } GetAttributeByName Àº POSTGRES ½Ã½ºÅÛ ÇÔ¼ö·Î¼­ ÇöÀç ÀνºÅϽºÀÇ ¼Ó¼ºÀ» ¹ÝȯÇÑ ´Ù. ¿©±â¿¡´Â ¼¼°³ÀÇ ¸Å°³ÀÎÀÚ°¡ ÀÖ´Â µ¥, ±×°¢°¢Àº ÇÔ¼ö·Î ³Ñ°ÜÁø TUPLE Çü ¸Å°³ÀÎÀÚ, ¾ò±â¸¦ ¹Ù¶ó´Â ¼Ó¼ºÀÇ À̸§, ÇØ´ç ¼Ó¼ºÀÌ ³ÎÀÎÁö¸¦ ³ªÅ¸³»´Â ¹Ýȯ°ªÀ» ÀúÀåÇÏ´Â ¸Å°³ÀÎÀÚÀÌ´Ù. GetAttributeByName Àº ¾Æ¸¶µµ µ¥ÀÌÅ͸¦ Á¤·ÄÇÒ °ÍÀ̱⿡ ¹Ýȯ°ªÀ» ¿øÇÏ´Â ÇüÀ¸·Î º¯È¯ ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é, char16 ÇüÀÎ ¼Ó¼º name ÀÌ ÀÖ´Ù¸é, GetAttributeByName È£ÃâÀº ´ÙÀ½°ú °°À» °ÍÀÌ´Ù. char *str; ... str = (char *) GetAttributeByName(t, "name", &isnull) ´ÙÀ½ÀÇ ÁúÀÇ´Â POSTGRES ¿¡°Ô c_overpaid ÇÔ¼ö¸¦ ÀνĽÃÅ°±â À§ÇÑ °ÍÀÌ´Ù. CREATE FUNCTION c_overpaid(EMP, int4) RETURNS bool AS '/usr/local/postgres95/tutorial/obj/funcs.so' LANGUAGE 'c'; C ÇÔ¼ö³»ºÎ¿¡¼­ºÎÅÍ »õ·Î¿î ÀνºÅϽº¸¦ »ý¼ºÇϰųª Á¸ÀçÇÏ´Â ÀνºÅϽº¸¦ º¯°æÇÒ ¼öµµ ÀÖÁö¸¸, ÀÌ ¸Þ´º¾ó¿¡¼­ ³íÀÇÇϱ⿡´Â ³Ê¹« º¹ÀâÇÏ´Ù. 7.3 ¸î°¡Áö ÁÖÀÇ»çÇ× ÀÌÁ¦ Á» ´õ ±î´Ù·Î¿î ÇÁ·Î±×·¡¹Ö ¾ð¾î ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ´Â ÀÓ¹«·Î µ¹¾Æ¿Íº¸ÀÚ. °æ°íÇÏÁö¸¸ ÀÌ ³»¿ëÀº ¿©·¯ºÐÀ» ÇÁ·Î±×·¡¸Ó·Î ¸¸µé±â À§ÇÑ °ÍÀÌ ¾Æ´Ï´Ù. ¿©·¯ºÐµé Àº POSTGRES ·Î ½ÇÁ¦·Î »ç¿ëÇÒ ÇÔ¼ö¸¦ C ·Î ÀÛ¼ºÇÏ·Á°í Çϱ⿡ ¾Õ¼­ C (Æ÷ÀÎÅÍÀÇ »ç¿ë, malloc ¸Þ¸ð¸® °ü¸® µîÀ» Æ÷ÇÔ)¸¦ Á¦´ë·Î ÀÌÇØÇÏ°í ÀÖ¾î¾ß ÇÑ´Ù. C °¡ ¾Æ´Ñ ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇÑ ÇÔ¼ö¸¦ POSTGRES ·Î ÀûÀçÇÒ ¼ö ÀÖ±ä ÇÏÁö¸¸, ÀÌ ÀÛ¾÷Àº Á¾Á¾ ±î´Ù·Ó´Ù. ¿Ö³ÄÇϸé Æ÷Æ®¶õÀ̳ª ÆĽºÄ®°ú °°Àº ´Ù¸¥ ¾ð¾î´Â Á¾Á¾ "È£Ãâ °ü½À" ÀÌ C ¿Í´Â ´Ù¸£±â ¶§¹®ÀÌ´Ù. ÀÌÁ¡Àº, ´Ù¸¥ ¾ð¾î´Â °°Àº ¹æ¹ýÀ¸·Î ÇÔ¼ö»çÀÌ¿¡ ¸Å°³ÀÎÀÚ¸¦ Àü´ÞÇϰųª °ªÀ» ¹ÝȯÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î, ¿©·¯ºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î ÇÔ¼ö´Â C ·Î ÀÛ¼ºµÇ¾ú´Ù°í °¡Á¤ÇÑ´Ù. C ·Î ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¶§ÀÇ ±âº»ÀûÀÎ ±ÔÄ¢Àº ´ÙÀ½°ú °°´Ù. (1) POSTGRES ¿¡ À־ ´ëºÎºÐÀÇ Çì´õÆÄÀÏÀº /usr/local/postgres95/include ¿¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù(±×¸² 2¿¡¼­ º¸µíÀÌ). cc ¸í·ÉÇà¿¡¼­ -I/usr/local/postgres95/include ¸¦ ¸í½ÃÇÏ¿© Çì´õÆÄÀÏÀ» Ç×»ó Æ÷ÇÔÇÏ¿©¾ß ÇÑ´Ù. °¡²û, ´ç½ÅÀÌ Ã£´Â Çì´õÆÄÀÏÀÌ ¼­¹ö ¼Ò½º Áß¿¡ ÀÖÀ» ¼öµµ ÀÖ´Ù (¿ì¸®°¡ °ÔÀ»·¯¼­ ¼³Ä¡¿¡ ºü¶ß¸° Çì´õÆÄÀÏÀº ¿©·¯ºÐµéÀÌ Á÷Á¢ include ¿¡ ¼³Ä¡ÇÒ Çʿ伺ÀÌ ÀÖ´Ù). ÀÌ·¯ÇÑ °æ¿ì¿¡ ´ÙÀ½ Áß ÇϳªÀÌ»óÀ» Ãß°¡ÇÒ ¼öµµ ÀÖ´Ù. -I/usr/local/postgres95/src/backend -I/usr/local/postgres95/src/backend/include -I/usr/local/postgres95/src/backend/port/ -I/usr/local/postgres95/src/backend/obj (¿©±â¿¡¼­ Àº alpha ³ª sparc ¿Í °°Àº Æ÷Æ® ¸íĪÀÌ´Ù. ) (2) ¸Þ¸ð¸® ÇÒ´çÀ» ÇÒ ¶§, C ¶óÀ̺귯¸®ÀÇ malloc ¿Í free ·çƾ ´ë½Å POSTGRES ÀÇ palloc ¿Í pfree ·çƾÀ» »ç¿ëÇÑ´Ù. palloc ¿¡ ÀÇÇØ ÇÒ´çµÈ ¸Þ¸ð¸®´Â ¸Å°³ Æ®·£ Àè¼ÇÀÇ ³¡ºÎºÐ¿¡¼­ ÀÚµ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÀÚÀ¯·Ó°Ô Çϸç, ¸Þ¸ð¸® À¯ÃâÀ» ¸·´Â´Ù. (3) ÇØ´ç ±¸Á¶Ã¼´Â Ç×»ó memset ¶Ç´Â bzero ¸¦ »ç¿ëÇÏ¿© 0À¸·Î ÃʱâÈ­ÇÏ´Â °ÍÀÌ ÁÁ ´Ù. (Çؽ¬ ¿¢¼¼½º ¸Þ½îµå, Çؽ¬ °áÇÕ, Á¤·Ä ¾Ë°í¸®Áò µî°ú °°Àº) ¿©·¯ ·çƾÀº ±¸Á¶Ã¼¿¡ ÀÖ´Â ·Î¿ì(raw) ºñÆ®ÀÇ ÀÛ¿ëÀ» ÃßÁ¤ÇÑ´Ù. ±¸Á¶Ã¼ÀÇ Çʵ带 ¸ð µÎ ÃʱâÈ­ÇÑ´Ù ÇÒÁö¶óµµ, ¾²·¹±â °ªÀ» Æ÷ÇÔÇÏ´Â, Á¤·Ä½Ã¿¡ ¹ß»ýÇϴ ä¿ö³Ö±â (±¸Á¶Ã¼¿¡¼­ÀÇ È¦)¹ÙÀÌÆ®°¡ ÀÖÀ» ¼ö ÀÖ´Ù. (4) ´ë°³ÀÇ ³»Àå POSTGRES µ¥ÀÌÅÍ ÇüÀº postgres.h ¿¡ Æ÷ÇÔµÇ¾î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î, º¸Åë ÀÌ ÆÄÀÏÀ» Æ÷ÇÔÇÏ´Â °ÍÀÌ ÁÁ´Ù. (5) POSTGRES ¿¡ µ¿ÀûÀ¸·Î ÀûÀçÇÒ ¸ñÀûÄڵ带 ÄÄÆÄÀÏÇÏ°í ÀûÀçÇÒ ½Ã¿¡´ÂƯº°ÇÑ Ç÷¡±×¸¦ ÇÊ¿ä·ÎÇÑ´Ù. ƯÁ¤ÇÑ ¿î¿µÃ¼Á¦ »ó¿¡¼­ ÀÌ·¯ÇÑ ÀÛ¾÷À» ÇÏ´Â ¹æ¹ý¿¡ ´ë ÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ºÎ·Ï A ¸¦ ÂüÁ¶Ç϶ó. #63 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (8) 08/17 17:39 109 line 8. È®Àå SQL : Çü (Type) ¾Õ¿¡¼­ »ìÆ캸¾ÒÁö¸¸, POSTGRES ¿¡´Â µÎ Á¾·ùÀÇ µ¥ÀÌÅÍ ÇüÀÌ ÀÖ´Ù. ±âº»(base)Çü (ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡ Á¤ÀǵǾî ÀÖ´Â Çü)°ú º¹ÇÕ(composite)Çü(ÀνºÅϽº)°¡ ÀÖ´Ù. ¿©±â¿¡ ³ª¿À´Â ¿¹Á¦µéÀº complex.sql °ú complex.c ¿¡ ³ª¿ÍÀÖ´Ù. º¹ÇÕ ¿¹Á¦´Â funcs.sql ¿¡ ³ª¿ÍÀÖ´Ù. 8.1 »ç¿ëÀÚ Á¤ÀÇ Çü 8.1.1 »ç¿ëÀÚ Á¤ÀÇ Çü¿¡ ÇÊ¿äÇÑ ÇÔ¼ö »ç¿ëÀÚ Á¤ÀÇ ÇüÀº ¹Ýµå½Ã input, output ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö ´Â ÇüÀÌ (»ç¿ëÀÚ°¡ ÀÔ·ÂÇÏ°í »ç¿ëÀÚ¿¡°Ô Ãâ·ÂµÇ´Â)¹®ÀÚ¿­¿¡ ¾î¶»°Ô ³ªÅ¸³ª´Â Áö¿Í ÇØ´ç ÇüÀÌ ¸Þ¸ð¸®¿¡ ¾î¶»°Ô ÆíÀçµÇ´ÂÁö¸¦ °Ë»çÇÑ´Ù. ÀÔ·ÂÇÔ¼ö´Â ³Î·Î ³¡³ª´Â ¹®ÀÚ ¿­À» ÀÔ·ÂÀ¸·Î ¹Þ¾Æµé¿©¼­ ÇØ´ç ÇüÀÇ ³»ºÎÀûÀΠǥÇöÀ» ¹ÝȯÇÑ´Ù. Ãâ·ÂÇÔ¼ö´Â ÇØ´ç ÇüÀÇ ³»ºÎÀûÀΠǥÇöÀ» ¹Þ¾Æµé¿©¼­ ³Î·Î ³¡³ª´Â ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. º¹ÇÕ ¼ýÀÚ¸¦ Ç¥ÇöÇÏ´Â complex µ¥ÀÌÅÍ ÇüÀ» Á¤ÀÇÇغ¸ÀÚ. ÀÌ º¹ÇÕÇüÀ» ¸Þ¸ð¸®¿¡ Ç¥ ÇöÇϱâ À§ÇØ ÀÚ¿¬½º·´°Ô ´ÙÀ½ÀÇ C ±¸Á¶Ã¼¸¦ ¼±ÅÃÇÒ °ÍÀÌ´Ù. typedef struct Complex { double x; double y; } Complex; (x,y) ÇüÅÂÀÇ ¹®ÀÚ¿­Àº ¿ÜºÎÀûÀÎ ¹®ÀÚ¿­·Î Ç¥ÇöµÈ´Ù. ÀÌ·¯ÇÑÇÔ¼ö´Â º¸Åë ÀÛ¼ºÇϱⰡ ½¬¿ì¸ç, ƯÈ÷ Ãâ·ÂÇÔ¼ö´Â ´õ ½±´Ù. ±×·¯³ª, ¿©±â¿¡¼­ ±â¾ïÇØ¾ß ÇÒ ¸î°¡Áö »çÇ×ÀÌ ÀÖ´Ù. (1) ¿ÜºÎÀûÀÎ (¹®ÀÚ¿­) Ç¥ÇöÀ» Á¤ÀÇÇÒ ¶§, ÃÖÁ¾ÀûÀ¸·Î ÀÔ·ÂÇÔ¼ö°¡ ÇØ´ç Ç¥ÇöÀ» Àß ¹Þ¾ÆµéÀÌ´Â ¿Ïº®ÇÏ°í Æ°Æ°ÇÑ ºÐ¼®±â°¡ µÇµµ·Ï ÇØ¾ß ÇÑ´Ù´Â Á¡À» ±â¾ïÇÏÀÚ! Complex * complex_in(char *str) { double x, y; Complex *result; if (sscanf(str, " ( %1f , %1f )", &x, &y) != 2) { elog(WARN, "complex_in: error in parsing \"%s\"", str); return NULL; } result = (Complex *) palloc(sizeof(Complex)); result->x = x; result->y = y; return (result); } Ãâ·ÂÇÔ¼ö´Â ´õ¿í °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. char * complex_out(Complex *complex) { char *result; if (complex == NULL) return(NULL); result = (char *) palloc(60); sprintf(result, "(%g,%g)", complex->x, complex->y); return(result); } (2) ÀÔ·Â, Ãâ·Â ÇÔ¼ö¸¦ ¸¸µé ¶§ ¼­·Î ¿ªÀ¸·Î ¸¸µé¾î º¸´Â °ÍÀ» ½ÃµµÇغ¸¾Æ¾ß ÇÑ´Ù. ¸¸ÀÏ ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â, ÇØ´ç µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ´ýÇÁÇϰųª (´Ù¸¥ ½Ã ½ºÅÛ»óÀÇ ¾î¶² ´Ù¸¥ µ¥ÀÌÅͺ£À̽º·Î) °Å²Ù·Î ÀоîµéÀÏ ¶§ ¿©·¯°¡Áö ¹®Á¦°¡ ¹ß »ýÇÒ °ÍÀÌ´Ù. ƯÈ÷ ºÎµ¿ ¼Ò¼öÁ¡À» Æ÷ÇÔÇÒ ¶§ °øÅëÀûÀÎ ¹®Á¦·Î ³ªÅ¸³­´Ù. complex ÇüÀ» ¸¸µé·Á¸é, ÇØ´ç ÇüÀ» ¸¸µé±â ÀÌÀü¿¡ complex_in °ú complex_out ÀÇ µÎ°¡Áö »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. CREATE FUNCTION complex_in(opaque) RETURNS complex AS '/usr/local/postgres95/tutorial/obj/complex.so' LANGUAGE 'c'; CREATE FUNCTION complex_out(opaque) RETURNS opaque AS '/usr/local/postgres95/tutorial/obj/complex.so' LANGUAGE 'c'; CREATE TYPE complex ( internallength = 16, input = complex_in, output = complex_out ); ¾Õ¿¡¼­µµ ¸»ÇßÁö¸¸, POSTGRES ´Â ±âº»ÇüÀÇ ¹è¿­À» dzÁ·ÇÏ°Ô Á¦°øÇÑ´Ù. ¾Æ¿ï·¯, POSTGRES ´Â »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ ¹è¿­µµ Àß Á¦°øÇÑ´Ù. ÇüÀ» Á¤ÀÇÇÒ ¶§, POSTGRES ´Â ÀÚµ¿ÀûÀ¸·Î ÇØ´ç ÇüÀÇ ¹è¿­À» Á¦°øÇÑ´Ù. ÀüÅëÀûÀ¸·Î, ¹è¿­ÇüÀÇ À̸§Àº »ç¿ëÀÚ Á¤ÀÇ ÇüÀÇ ¸íĪ¾Õ¿¡ ¹ØÁÙ ¹®ÀÚ '_' °¡ ¾Õ¿¡ À§Ä¡ÇÏ´Â ÇüÅ°¡ µÈ´Ù. º¹ÇÕÇüÀº ¾î¶°ÇÑ ÇÔ¼öµµ ÇÊ¿äÇÏÁö ¾Ê´Ù. ½Ã½ºÅÛÀº ÀÌ¹Ì ÀÌµé ³»ºÎ¸¦ ÀÌÇØÇϱ⠶§¹® ÀÌ´Ù. 8.1.2 ´ëÇü °´Ã¼ Áö±Ý±îÁö ³íÀÇÇÑ ÇüÀº ¸ðµÎ "¼ÒÇü(small)" °´Ã¼À̸ç 8KB (ÁÖ7) º¸´Ù ÀÛÀº °ÍµéÀÌ´Ù. ¹®¼­È­ ½Ã½ºÅÛÀ̳ª ºñÆ®¸Ê ÀúÀå ½Ã½ºÅÛ°ú °°Àº ´ëÇü ÇüÀÌ ÇÊ¿äÇÏ´Ù¸é, POSTGRES ´ëÇü°´Ã¼ (large object) ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù. ÁÖ7) 8 * 1024 ´Â 8192 ¹ÙÀÌÆ®ÀÌ´Ù. POSTGRES ÀÇ tuple °ú ÆäÀÌÁö ¿À¹öÇìµå´Â ÀÌ ·¯ÇÑ 8KB ÇÑ°è¿¡ ÀûÇÕÇØ¾ß Çϱ⠶§¹®¿¡ ½ÇÁ¦·Î ÇϳªÀÇ ÇüÀº 8192 ¹ÙÀÌÆ®º¸´Ù ÀÛ°Ô °í·ÁµÇ¾î¾ß ÇÑ´Ù. ÀÌ¿¡ ÀûÇÕÇÑ ½ÇÁ¦ °ªÀº ÇØ´ç ±â°èÀÇ ¾ÆÅ°ÅØÃÄ¿¡ ÀÇÁ¸ ÀûÀÌ´Ù. #64 Çѵ¿ÈÆ (ddoch ) [¹ø¿ª] postgres 1.0 ¸Þ´º¾ó (9,10) 08/17 19:57 112 line 9. È®Àå SQL : ¿¬»êÀÚ POSTGRES ´Â ¿ÞÂÊ, ¿À¸¥ÂÊ ´ÜÀÏ ¿¬»êÀÚ¿Í ¹ÙÀ̳ʸ® ¿¬»êÀÚ¸¦ Á¦°øÇÑ´Ù. ¿¬»êÀÚ´Â ¼­·Î ´Ù¸¥ ¼ýÀÚ³ª ÇüÀÇ ¸Å°³ÀÎÀÚ¿¡ °úÁß ÀûÀçµÇ°Å³ª Àç»ç¿ëµÉ ¼ö ÀÖ´Ù. ¿¬»êÀÚ°¡ ¾Ö¸ÅÇÑ À§Ä¡¿¡ ÀÖ´Ù¸é ½Ã½ºÅÛÀº ¿Ã¹Ù¸¥ ¿¬»êÀÚ¸¦ °áÁ¤ÇÒ ¼ö ¾øÀ¸ ¸ç, ¿¡·¯¸¦ ¹ÝȯÇÑ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡, ¾î´À ¿¬»êÀÚ¸¦ »ç¿ëÇÒ °ÍÀÎÁö ÀÌÇظ¦ µ½ ±â À§ÇØ ¿ÞÂÊ/¿À¸¥ÂÊ ÇÇ¿¬»êÀÚ¸¦ Çüº¯È¯ ÇÒ ¼ö ÀÖ´Ù. µÎ°³ÀÇ complex ¸â¹ö¸¦ ´õÇÏ´Â ¿¬»êÀÚ¸¦ ¸¸µå·Á¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. ¸ÕÀú »õ·Î¿î Çü¿¡ ÇÊ¿äÇÑ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ³ª¼­, ÇØ´ç ¿¬»êÀÚ¸¦ À̵é ÇÔ ¼ö¿Í ÇÔ²² ¸¸µé¸é µÈ´Ù. CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS '$PWD/obj/complex.so' LANGUAGE 'c'; CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + ); ¿©±â¿¡¼­ ¹ÙÀ̳ʸ® ¿ÀÆÛ·¹ÀÌÅ͸¦ ¸¸µå´Â ¹æ¹ýÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÜÀÏ ¿ÀÆÛ·¹ ÀÌÅ͸¦ ¸¸µé·Á¸é leftarg(¿ÞÂÊ ´ÜÀÏ ¿ÀÆÛ·¹ÀÌÅÍ) ³ª rightarg(¿À¸¥ÂÊ ´ÜÀÏ ¿ÀÆÛ·¹ÀÌ ÅÍ)Áß Çϳª¸¦ »ý·«ÇÏ¸é µÈ´Ù. ½Ã½ºÅÛ¿¡ ÇØ´ç Çü¿¡ ´ëÇÑ ÃæºÐÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù¸é, ½Ã½ºÅÛÀº ¾î¶°ÇÑ ¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇÏ´Â °ÍÀÌ Àû´çÇÑÁö ÀÚµ¿ÀûÀ¸·Î »ý°¢ÇØ ³¾ ¼ö ÀÖ´Ù. SELECT (a + b) AS c FROM test_complex; c --------------- (5.2,6.05) (133.42,144.95) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10. È®Àå SQL : Àüü (Aggregates) POSTGRES ÀÇ Aggregates ´Â »óÅ º¯È¯ ÇÔ¼ö(state transition functions)¶ó´Â °üÁ¡ À¸·Î Ç¥ÇöµÈ´Ù. Aggregate ´Â ÇϳªÀÇ ÀνºÅϽº°¡ ó¸®µÉ ¶§¸¶´Ù º¯°æµÇ´Â »óÅ (state)¶ó´Â °üÁ¡À¸·Î Á¤ÀÇµÉ ¼ö ÀÖ´Ù. ¾î¶² »óÅ ÇÔ¼ö´Â ÀνºÅϽº¿¡¼­ »õ·Î¿î »ó Ÿ¦ °è»êÇÒ ¶§ ƯÁ¤ÇÑ °ªÀ» ã°í(create aggregate ¹®¹ý¿¡¼­ sfunc1), ´Ù¸¥ »óÅ ÇÔ¼ö´Â ÀÚ½ÅÀÇ ³»ºÎÀûÀÎ »óÅÂÀÇ ÀÚÃ븦 À¯Áö¸¸ ÇÑ´Ù(sfunc2). aggregate °¡ sfunc1 ¸¸ »ç¿ëÇÑ´Ù¸é, °¢°¢ÀÇ ÀνºÅϽº¿¡¼­ ¼Ó¼º°ª»ó¿¡¼­ ½ÇÇàµÇ´Â ÇÔ¼ö·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. "Sum" Àº ÀÌ·¯ÇÑ Á¾·ùÀÇ aggregate ÀÇ ¿¹ÀÌ´Ù. "Sum" Àº óÀ½¿¡´Â 0ÀÇ °ªÀ» °¡Áö°í, °è¼Ó ÇöÀçÀÇ ÀνºÅϽºÀÇ °ªÀ» ÇÕ°è·Î ´õÇÑ´Ù. Àá½ÃµÚ¿¡ int4pl À» »ç¿ëÇÏ¿© POSTGRES °¡ ÀÌ·¯ÇÑ µ¡¼ÀÀ» ¼öÇàÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. CREATE AGGREGATE complex_sum ( sfunc1 = complex_add, basetype = complex, stype1 = complex, initcond1 = '(0,0)' ); SELECT complex_sum(a) FROM test_complex; complex_sum ----------- (34,53.9) sfunc2 ¸¸ Á¤ÀÇÇÑ´Ù¸é, °¢°¢ÀÇ ÀνºÅϽº¿¡¼­ ¼Ó¼º°ª°ú´Â µ¶¸³ÀûÀ¸·Î ¼öÇàµÇ´Â ÇÔ¼ö ·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. "Count" ´Â ÀÌ·¯ÇÑ aggregate Á¾·ùÀÇ ´ëÇ¥ÀûÀÎ °æ¿ìÀÌ´Ù. "Count" ´Â 0¿¡¼­ ½ÃÀ۵ǰí, °¢°¢ÀÇ ÀνºÅϽº¸¶´Ù ÇÕ°è¿¡ 1ÀÌ ´õÇØÁö¸ç ÀνºÅϽºÀÇ °ªÀº ¹«½ÃµÈ´Ù. ¿©±â¼­´Â POSTGRES ³»Àå ·çƾÀÎ int4inc ¸¦ »ç¿ëÇÑ´Ù. ÀÌ ·çƾÀº ÇØ´ç ÀÎÀÚÀÇ °ªÀ» Çϳª Áõ°¡½ÃŲ´Ù. CREATE AGGREGATE my_count (sfunc2 = int4inc, -- add one basetype = int4, stype2 = int4, initcond2 = '0' ); SELECT my_count(*) as emp_count from EMP; emp_count --------- 4 "Average" ´Â ÇÕ°è¿Í Ƚ¼ö, µÑ´Ù °è»êÇÏ´Â ÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÏ´Â aggregate ÀÇ ¿¹ÀÌ ´Ù. ¸ðµç ÀνºÅϽº°¡ ó¸®µÇ°í ³ª¸é, aggregate ¿¡¼­ ¸¶Áö¸· ÀÀ´äÀ¸·Î Çհ踦 Ƚ ¼ö·Î ³ª´«´Ù. ÀÌÀü¿¡ »ç¿ëÇß´ø int4pl °ú int4inc ¿Í ¸¶Âù°¡Áö·Î int4div ´Â POSTGRES ÀÇ Á¤¼ö ³ª´°¼À ·çƾÀ̸ç, Çհ踦 Ƚ¼ö·Î ³ª´« °á°ú¸¦ °è»êÇÑ´Ù. CREATE AGGREGATE my_average (sfunc1 = int4pl, -- sum basetype = int4, stype1 = int4, sfunc2 = int4inc, -- count stype2 = int4, finalfunc = int4div, -- division initcond1 = '0', initcond1 = '0' ); SELECT my_average(salary) as emp_average FROM EMP; emp_average ------------ 1640