´Ù°¢ÇüÀÇ n¹øÂ° ³»ºÎ ¸µÀ» ¼±½ºÆ®¸µÀ¸·Î¼ ¸®ÅÏÇÕ´Ï´Ù. ¸µÀº ±âÇÏÇÐ ¹æÇâ¿¡ ÀÇÇØ ±¸¼ºµÇÁö ¾Ê½À´Ï´Ù. ¸µÀº ³»ºÎ ±âÇÏÇÐ °ËÁõ ·çƾ¿¡ ÀÇÇØ Á¤ÀÇµÈ ±ÔÄ¢¿¡ µû¶ó ±¸¼ºµË´Ï´Ù. ±×·¯¹Ç·Î ¸µÀÇ ¼ø¼´Â »çÀü Á¤ÀÇÇÒ ¼ö ¾ø½À´Ï´Ù.
±¸¹®
ST_InteriorRingN(p ST_Polygon, n Integer)
¸®ÅÏ À¯Çü
db2gse.ST_LineString
¿¹
¿©·¯ ³²ÇØ ¼¶¿¡ »ç´Â Á¶·ù Áý´ÜÀ» ¿¬±¸ÇÏ´Â Á¶·ùÇÐÀÚ´Â ¼öµ¿ÀûÀΠƯÁ¤ Á¶·ùÁ¾ÀÇ »ýÅ ±¸¿ªÀÌ ÇØ¾È¼±¿¡ Á¦ÇѵǾî ÀÖÀ½À» ¾Ë°í ÀÖ½À´Ï´Ù. ÀϺΠ¼¶¿¡´Â ¿©·¯ °³ÀÇ È£¼ö°¡ ÀÖ½À´Ï´Ù. È£¼öÀÇ ÇØ¾È¼±Àº º¸´Ù °ø°ÝÀûÀÎ ´Ù¸¥ Á¶·ù Á¾ÀÌ µ¶Á¡ÀûÀ¸·Î ¼½ÄÇϰí ÀÖ½À´Ï´Ù. »ýÅÂÇÐÀÚ´Â °¢ ¼¶ÀÇ °æ¿ì¿¡ È£¼öÀÇ ÁÖ°è°¡ ƯÁ¤ ÀÓ°è°ªÀ» ÃʰúÇÏ¸é °ø°ÝÀûÀÎ Á¶·ùÁ¾ÀÌ ³Ê¹« ¸¹¾ÆÁ®¼ ¼öµ¿ÀûÀÎ ¼¶ ÇØ¾È¼± Á¶·ùÁ¾À» À§ÇùÇÒ °ÍÀÓÀ» ¾Ë°í ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î, Á¶·ùÇÐÀÚ¿¡°Ô´Â ¼¶ÀÇ ÃÑ ³»ºÎ µÑ·¹°¡ ÇÊ¿äÇÕ´Ï´Ù.
±×¸² 34¿¡¼ ¼¶ÀÇ ¿ÜºÎ ¸µÀº °¢°¢ÀÇ ¼¶ÀÌ ¹Ù´Ù¿Í °øÀ¯ÇÏ´Â »ýÅÂÇÐÀû ÀÎÅÍÆäÀ̽º¸¦ ³ªÅ¸³À´Ï´Ù. ÀϺΠ¼¶¿¡´Â ´Ù°¢ÇüÀÇ ³»ºÎ ¸µÀ¸·Î Ç¥ÇöµÇ´Â È£¼ö°¡ ÀÖ½À´Ï´Ù.
±×¸² 34. ST_InteriorRingNÀ» »ç¿ëÇÏ¿© °¢ ¼¶¿¡ Àִ ȣ¼ö ÇØ¾È¼±ÀÇ ±æÀ̸¦ ÆÇº°
ISLANDS Å×À̺íÀÇ ID ¹× À̸§ Ä÷³Àº °¢ ¼¶À» ³ªÅ¸³»¸ç ¼¶ ´Ù°¢Çü Ä÷³Àº ¼¶ÀÇ ±âÇÏÇÐÀ» ÀúÀåÇÕ´Ï´Ù.
CREATE TABLE ISLANDS (id integer, name varchar(32), land db2gse.ST_Polygon);
´ÙÀ½ÀÇ ODBC ÇÁ·Î±×·¥¿¡¼´Â ST_InteriorRingN ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© °¢ ¼¶ ´Ù°¢Çü¿¡¼ ³»ºÎ ¸µ(È£¼ö)À» ¼±½ºÆ®¸µÀ¸·Î¼ ¹ßÃéÇÕ´Ï´Ù. ±æÀÌ ÇÔ¼ö¿¡ ÀÇÇØ ¸®ÅϵǴ ¼±½ºÆ®¸µÀÇ Áְ踦 ¸ðµÎ ÇÕÇØ ¼¶ÀÇ ID¿Í ÇÔ²² Ç¥½ÃÇÕ´Ï´Ù.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "sg.h" #include "sgerr.h" #include "sqlcli1.h" /*** *** *** »ó¼ö º¯°æ *** *** ***/ #define USER_NAME "sdetest" /* »ç¿ëÀÚ À̸§ */ #define USER_PASS "acid.rain" /* »ç¿ëÀÚ ¾ÏÈ£ */ #define DB_NAME "mydb" /* ¿¬°áÇÒ µ¥ÀÌÅͺ£À̽º */ static void check_sql_err (SQLHDBC handle, SQLHSTMT hstmt, LONG rc, CHAR *str); void main( argc, argv ) int argc; char *argv[]; { SQLHDBC handle; SQLHENV henv; CHAR sql_stmt[256]; LONG rc, total_perimeter, num_lakes, lake_number, island_id, lake_perimeter; SQLHSTMT island_cursor, lake_cursor; SDWORD pcbvalue, id_ind, lake_ind, length_ind; /* ODBC ȯ°æ ÇÚµé henv¿¡ ´ëÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí, ÀÀ¿ëÇÁ·Î±×·¥À» ÃʱâÈÇÕ´Ï´Ù. */ rc = SQLAllocEnv (&henv); if (rc != SQL_SUCCESS) { printf ("SQLAllocEnv failed with %d\n", rc); exit(0); } /* henv ȯ°æ ³»¿¡ ¿¬°á Çڵ鿡 ´ëÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÕ´Ï´Ù. */ rc = SQLAllocConnect (henv, &handle); if (rc != SQL_SUCCESS) { printf ("SQLAllocConnect failed with %d\n", rc); exit(0); } /* ODBC µå¶óÀ̹ö¸¦ ·ÎµåÇÏ°í µ¥ÀÌÅͺ£À̽º, »ç¿ëÀÚ ¹× ¾ÏÈ£¿¡ ÀÇÇØ ½Äº°µÇ´Â µ¥ÀÌÅÍ ¼Ò½º¿¡ ¿¬°áÇÕ´Ï´Ù.*/ rc = SQLConnect (handle, (UCHAR *)DB_NAME, SQL_NTS, (UCHAR *)USER_NAME, SQL_NTS, (UCHAR *)USER_PASS, SQL_NTS); check_sql_err (handle, NULL, rc, "SQLConnect"); /* ¸Þ¸ð¸®¸¦ SQL¹® ÇÚµé island_cursor¿¡ ÇÒ´çÇÕ´Ï´Ù. */ rc = SQLAllocStmt (handle, &island_cursor); check_sql_err (handle, NULL, rc, "SQLAllocStmt"); /* island ID ¹× lakes(³»ºÎ ¸µ) ¼ö¸¦ ¾ò±â À§ÇÑ Á¶È¸¸¦ Áغñ ¹× ½ÇÇàÇÕ´Ï´Ù. */ strcpy (sql_stmt, "select id, db2gse.ST_NumInteriorRings(land) from ISLANDS"); rc = SQLExecDirect (island_cursor, (UCHAR *)sql_stmt, SQL_NTS); check_sql_err (NULL, island_cursor, rc, "SQLExecDirect"); /* island Å×À̺íÀÇ ID Ä÷³À» º¯¼ö island_id¿¡ ¹ÙÀεåÇÕ´Ï´Ù. */ rc = SQLBindCol (island_cursor, 1, SQL_C_SLONG, &island_id, 0, &id_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* numinteriorrings(land)ÀÇ °á°ú¸¦ num_lakes º¯¼ö¿¡ ¹ÙÀεåÇÕ´Ï´Ù. */ rc = SQLBindCol (island_cursor, 2, SQL_C_SLONG, &num_lakes, 0, &lake_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* SQL¹® ÇÚµé lake_cursor¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÕ´Ï´Ù. */ rc = SQLAllocStmt (handle, &lake_cursor); check_sql_err (handle, NULL, rc, "SQLAllocStmt"); /* ³»ºÎ ¸µÀÇ ±æÀ̸¦ °¡Á®¿À±â À§ÇÑ Á¶È¸¸¦ ÁغñÇÕ´Ï´Ù. */ strcpy (sql_stmt, "select Length(db2gse.ST_InteriorRingN(land, cast (? as integer))) from ISLANDS where id = ?"); rc = SQLPrepare (lake_cursor, (UCHAR *)sql_stmt, SQL_NTS); check_sql_err (NULL, lake_cursor, rc, "SQLPrepare"); /* lake_number º¯¼ö¸¦ ù¹øÂ° ÀÔ·Â ¸Å°³º¯¼ö·Î¼ ¹ÙÀεåÇÕ´Ï´Ù. */ pcbvalue = 0; rc = SQLBindParameter (lake_cursor, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &lake_number, 0, &pcbvalue); check_sql_err (NULL, lake_cursor, rc, "SQLBindParameter"); /* island_id¸¦ µÎ ¹øÂ° ÀÔ·Â ¸Å°³º¯¼ö·Î¼ ¹ÙÀεåÇÕ´Ï´Ù. */ pcbvalue = 0; rc = SQLBindParameter (lake_cursor, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &island_id, 0, &pcbvalue); check_sql_err (NULL, lake_cursor, rc, "SQLBindParameter"); /* Length(db2gse.ST_InteriorRingN(land, cast (? as integer)))ÀÇ °á°ú¸¦ lake_perimeter º¯¼ö¿¡ ¹ÙÀεåÇÕ´Ï´Ù. */ rc = SQLBindCol (lake_cursor, 1, SQL_C_SLONG, &lake_perimeter, 0, &length_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* ¿ÜºÎ ·çÇÁ(Outer loop), island id ¹× lakes(³»ºÎ ¸µ)ÀÇ ¼ö¸¦ °¡Á®¿É´Ï´Ù. */ while (SQL_SUCCESS == rc) { /* ¾ÆÀÏ·£µå »çÀü ÃßÃâ */ rc = SQLFetch (island_cursor); if (rc != SQL_NO_DATA) { check_sql_err (NULL, island_cursor, rc, "SQLFetch"); /* ³»ºÎ ·çÇÁ, ÀÌ island¿¡ ´ëÇØ ¸ðµç lakes(³»ºÎ ¸µ)ÀÇ Áְ踦 °¡Á®¿É´Ï´Ù. */ for (total_perimeter = 0,lake_number = 1; lake_number <= num_lakes; lake_number++) { rc = SQLExecute (lake_cursor); check_sql_err (NULL, lake_cursor, rc, "SQLExecute"); rc = SQLFetch (lake_cursor); check_sql_err (NULL, lake_cursor, rc, "SQLFetch"); total_perimeter += lake_perimeter; SQLFreeStmt (lake_cursor, SQL_CLOSE); } } /* Island id ¹× lakes¿¡ ´ëÇÑ Àüü Áְ踦 Ç¥½ÃÇÕ´Ï´Ù. */ printf ("Island ID = %d, Total lake perimeter = %d\n", island_id,total_perimeter); } SQLFreeStmt (lake_cursor, SQL_DROP); SQLFreeStmt (island_cursor, SQL_DROP); SQLDisconnect (handle); SQLFreeConnect (handle); SQLFreeEnv (henv); printf( "\nTest Complete ...\n" ); } static void check_sql_err (SQLHDBC handle, SQLHSTMT hstmt, LONG rc, CHAR *str) { SDWORD dbms_err = 0; SWORD length; UCHAR err_msg[SQL_MAX_MESSAGE_LENGTH], state[6]; if (rc != SQL_SUCCESS) { SQLError (SQL_NULL_HENV, handle, hstmt, state, &dbms_err, err_msg, SQL_MAX_MESSAGE_LENGTH - 1, &length); printf ("%s ERROR (%d): DBMS code:%d, SQL state: %s, message: \n %s\n", str, rc, dbms_err, state, err_msg); if (handle) { SQLDisconnect (handle); SQLFreeConnect (handle); } exit(1); } }