Background Image
조회 수 24871 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Collection Data Type 사용하기 - JDBC

소개: Collection Data Type의 데이터를 JDBC 인터페이스를 이용하여 저장, 조회, 수정 하는 방법을 예제를 통해 설명한다. 일반적인 인터페이스 관련 설명이나 CUBRID에 대해서는 별도 설명하지 않는다

적용 대상: CUBRID2008, JDK 1.5.0_19

 

Collection Data Type

Collection Data Type은 하나의 컬럼에 여러 개의 값을 넣을 수 있는 데이터 타입으로 SET, SEQUENCE, MULTISET 세가지가 있다. 각 원소의 데이터 타입으로는 기본 데이터 타입, 시스템 정의 클래스, 사용자 테이블을 모두 사용할 수 있다.

·      SET : 각 원소에 대해 동일한 값(중복)을 허용하지 않고, 순서가 존재하지 않음.

·      MULTISET : 중복을 허용하고, 순서가 존재하지 않음.

·      SEQUENCE : 중복을 허용하고, 순서가 존재함.

타입

정의

예제

입력

저장

SET

set(integer)

{1, 4, 1, 2, 3}

{1, 2, 3, 4}

MULTISET

multiset(integer)

{1, 4, 1, 2, 3}

{1, 1, 2, 3, 4}

SEQUENCE

sequence(integer)

{1, 4, 1, 2, 3}

{1, 4, 1, 2, 3}

데이터 저장

Collection Data Type에 데이터를 입력할 때는 INSERT 문장 value 부분의 “{“ “}” 사이에 원소를 나열하는 집합형태로 입력해야 한다.

INSERT INTO … VALUES (…, {‘흰색’, ‘검정색’, ‘은색’} )

사용자 정의 테이블을 데이터 타입으로 갖는 경우에는 {OID, OID, OID} 형태가 되어야 한다. INSERT 하려는 문장 안에 INSERT 문장을 중첩 사용해서 내부 INSERT 문장이 수행된 결과 OID가 외부 INSERT 문장에 적용되도록 한다.

INSERT INTO … VALUES (…, { INSERT INTO … , INSERT INTO …  } )

derived table 이용한 조회

derived table은 서브질의 결과 또는 Collection Type 데이터를 테이블 형태로 접근 가능하도록 하는 개념이다. SELECT 문장에서 Collection type 컬럼을 조회할 때 derived table 형태로 조회하면 일반적인 질의문과 마찬가지로 원소를 조회할 수 있다.

Table(collection_type_attribute_name) as derived_tbl_name(column_name)

수정

Collection Data type 데이터의 수정은 UPDATE 문장에서 +, -를 이용한다. +는 현재 Collection 값에 추가, -기호는 Collection 값에서 제거한다.

UPDATE car SET color = color – { ‘흰색’ } + { ‘상아색’ }

테스트 환경 준비

예제를 수행하기 위해서는 먼저 JAVA 실행 환경이 준비되어 있어야 하고 접속하고자 하는 DB ServerBroker가 구동 되어 있어야 한다. 여기서는 설치 시에 자동 생성되는 “demodb” DB를 사용한다.

테스트를 위해 다음과 같은 테이블을 먼저 생성한다.

CREATE TABLE car (

name char(40),

spec  string,

color   set(string(20))

);

CREATE TABLE user_info (

name string,

addr  string,

carinfo    set(car)

);

위 스키마는 car 테이블의 color 컬럼이 string(20)을 데이터 타입으로 사용하는 SET 타입으로 구성되어 여러 가지 색상의 차를 관리할 수 있도록 구성하고, user_info 테이블의 carinfo 컬럼이 car 테이블을 데이터 타입으로 사용하는 SET 타입으로 구성되어 여러 대의 차를 관리할 수 있도록 구성되어 있다.

데이터 저장

본 절에서는 SET Type에 데이터를 저장하는 방법을 설명한다.

import java.sql.*;

 

public class insertSET {

   public static void main(String[] args) throws Exception {

 

Connection conn = null;

Statement stmt = null;

 

      try {

          // CUBRID DB Connect

         Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

         conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","","");

 

// 데이터를 SET형식으로 직접 입력하려면 { }의 집합형태로 입력해야 한다.

// 아래의 질의는 SET인 데이터들이 다른 클래스를 가리키고 있는데 아래와 같이 집합기호 안에

// car에 데이터를 입력하면서 동시에 그것들의 OID user_info SET형식으로 입력한다.

         String sql = "insert into user_info values ('홍길동', '서울 강남구 논현동', " +

                      "{ insert into car values ('쏘나타','2000cc',{'은색','흰색','검정색'})," +

                             "insert into car values ('그랜져’,'3000cc',{'은색','흰색','검정색'})})";                // 1

          stmt = conn.createStatement();

          stmt.executeUpdate(sql);

          System.out.println("데이터가 입력되었습니다.");

          stmt.close();

      } catch ( SQLException e ) {

         System.err.println(e.getMessage());

      } catch ( Exception e ) {

         System.err.println(e.getMessage());

      } finally {

          if ( conn != null ) conn.close();

      }

   }

}

·      1 user_info 저장할 때에 car 정보도 함께 저장하며 저장된 car OID user_info 테이블의 carinfo 컬럼에 저장하는 insert문장을 생성한다. car 테이블의 color 컬럼과 user_info 테이블의 carinfo 컬럼은 SET Type으로 이루어져 있어 데이터가 집합형태로 저장된다.

- uer_info 테이블

name                  addr                                  carinfo

================================================

'홍길동'              '서울특별시 강남구 논현동'              {car, car}

 

- car 테이블

name                  spec                  color

==============================================

  '그랜져'              '3000CC'              {'검정색', '은색', '흰색'}

  '쏘나타'              '2000CC'              {'검정색', '은색', '흰색'}

derived table 이용한 조회

본 절에서는 derived table을 이용하여 데이터를 조회하는 방법을 설명한다.

import java.sql.*;

 

public class selectSET1 {

   public static void main(String[] args) throws Exception {

 

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

 

try {

// CUBRID DB Connect

         Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

          conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","","");

 

// 아래의 질의는 SET 타입의 데이터를 derived table로 나누어서 값을 가지고 온다.

          String sql = "SELECT name, addr, ci.name car_name, ci.spec spec, co color " +

                       "FROM user_info, TABLE(carinfo) tb(ci), TABLE(ci.color) tb2(co) WHERE name = '홍길동'";     // 1

          stmt = conn.createStatement();

          rs = stmt.executeQuery(sql);

          while(rs.next()) {

             String user_name = rs.getString("name");

             String user_addr = rs.getString("addr");

             String car_name = rs.getString("car_name");

             String car_spec = rs.getString("spec");

             String car_color = rs.getString("color");

 

             System.out.println(user_name + "/" + user_addr + "/" + car_name + "/" + car_spec + "/" + car_color);

          }

          rs.close();

          stmt.close();

      } catch ( SQLException e ) {

          System.err.println(e.getMessage());

      } catch ( Exception e ) {

          System.err.println(e.getMessage());

      } finally {

          if ( conn != null ) conn.close();

      }

   }

}

·      1 user_info 테이블의 carinfo 컬럼이 car 테이블을 원소로 갖는 SET Type이고, car 테이블의 color 컬럼이 SET Type으로 이루어진 Composite 관계이므로 SELECT .., ci.name, ci.spec, co color FROM user_info, TABLE(carinfo) tb(ci), TABLE(ci.color) tb2(co) 와 같이 carinfo 컬럼을 먼저 derived table로 사용하고 그 중 서브컬럼인 color를 두번째 derived table로 사용한다.

·      실행 결과는 아래와 같다.

홍길동/서울 강남구 논현동/쏘나타/2000cc/검정색

================================

홍길동/서울 강남구 논현동/쏘나타/2000cc/은색

================================

홍길동/서울 강남구 논현동/쏘나타/2000cc/흰색

================================

홍길동/서울 강남구 논현동/그랜져/3000cc/검정색

================================

홍길동/서울 강남구 논현동/그랜져/3000cc/은색

================================

홍길동/서울 강남구 논현동/그랜져/3000cc/흰색

================================

getCollection을 이용한 조회

본 절에서는 CUBRIDResultSet getCollection 메소드를 이용하여 데이터를 조회하는 방법을 설명한다.

import java.sql.*;

import cubrid.jdbc.driver.*;

import cubrid.sql.*;

 

public class selectSET2 {

   public static void main(String[] args) throws Exception {

 

Connection conn = null;

Statement stmt = null;

CUBRIDResultSet rs = null;

CUBRIDResultSet urs = null;

 

      try {

         Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

          conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","","");

          conn.setAutoCommit(false);          //1

          String sql = "select name, carinfo from user_info";

          stmt = conn.createStatement();

          rs = (CUBRIDResultSet)stmt.executeQuery(sql);

 

          while(rs.next()) {

             String user_name = rs.getString("name");

             // 데이터 타입이 SET인 경우 아래와 같이 getCollection을 사용.

             // 아래는 OID SET이므로 CUBRIDOID 의 배열에 값을 저장.

             CUBRIDOID[] car = (CUBRIDOID[])rs.getCollection("carinfo");           // 2

             System.out.println("이름 : " + user_name);

             // array에 저장한 값을 가지고 실제 값을 가지고 온다.

             for(int i=0; i<car.length; i++) {

                // getValues의 파라미터로 null을 주면 전체 컬럼를 가지고 온다.

                urs = (CUBRIDResultSet)car[i].getValues(null);                 // 3

                urs.next();

                String car_name = urs.getString("name");

                System.out.println("소유자동차 : " + car_name);

                //color varchar SET이므로 String의 배열에 값을 저장.

                String[] car_color = (String[])urs.getCollection("color"); //4

             System.out.println("색상 : " + car_color[0] + ", " + car_color[1] + ", " + car_color[2]);

             }

             System.out.println("n================================n");

          }

          urs.close();

          rs.close();

          stmt.close();

          conn.commit();

      } catch ( SQLException e ) {

          System.err.println(e.getMessage());

      } catch ( Exception e ) {

          System.err.println(e.getMessage());

      } finally {

          if ( conn != null ) conn.close();

      }

   }

}

·      1 한 개의 ResultSet close()되기 전에 다른 ResultSet을 생성할 경우 앞의 ResultSet autoCommit되어 close()된다.  따라서 이 코드와 같이 동시에 여러 개의 ResultSet이 필요한 경우엔 반드시 autoCommit false로 설정해야 한다. 이때 설정 위치는 항상 createStatement() 이전에 이뤄져야 한다.

·      2 데이터 조회한 결과값이 SET 타입인 경우, getCollection을 이용하여 값을 얻는다.  이 결과는 배열 형태로 저장된다.

·      3 array에 저장된 값을 for문을 통해 1개씩 불러온다.  여기에서는 저장된 값이 CUBRIDOID 이므로 getValues를 이용하여 실제 필요한 값을 얻을 수 있다.  getValues의 파라미터는 값을 가져올 컬럼들의 이름이지만 위의 예제처럼 null을 줄 수도 있다.  null을 입력한 경우에는 그 테이블의 모든 컬럼들의 값을 얻는다.

·      4 color string SET Type이므로 String의 배열에 값을 저장한다.

·      실행 결과

이름 : 홍길동

소유자동차 : 쏘나타

색상 : 검정색, 은색, 흰색

소유자동차 : 그랜져

색상 : 검정색, 은색, 흰색

================================

질의를 이용한 수정

본 절에서는 이미 저장된 SET Type 컬럼의 원소를 질의를 이용하여 추가, 삭제하는 방법을 설명한다.

import java.sql.*;

 

public class updateSET {

   public static void main(String[] args) throws Exception {

 

Connection conn = null;

Statement stmt = null;

 

      try {

         Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

         conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","","");

 

// UPDATE 문장에서 - 를 이용해서 현재 값에서 제거하고, + 을 이용해서 추가한다..

         String sql = "UPDATE car SET color = color - {'검정색'} + {'상아색'} WHERE name = '쏘나타'";        // 1

          stmt = conn.createStatement();

          stmt.executeUpdate(sql);

          System.out.println("데이터가 수정되었습니다.");

          stmt.close();

      } catch ( SQLException e ) {

         System.err.println(e.getMessage());

      } catch ( Exception e ) {

         System.err.println(e.getMessage());

      } finally {

          if ( conn != null ) conn.close();

      }

   }

}

·      1 SET type color의 현재 검정색을 제거하고 상아색을 추가한다.

- car 테이블

name                  spec                  color

==============================================

  '그랜져'              '3000CC'              {'검정색', '은색', '흰색'}

  '쏘나타'              '2000CC'              {'상아색', '은색', '흰색'}

OID를 이용한 수정

본 절에서는 이미 저장된 SET Type 컬럼의 원소를 OID를 이용하여 추가, 삭제하는 방법을 설명한다.

import java.sql.*;

import cubrid.jdbc.driver.*;

import cubrid.sql.*;

 

public class updateSET2 {

   public static void main(String[] args) throws Exception {

 

          Connection conn = null;

    Statement stmt = null;

    CUBRIDResultSet rs = null;

 

    try {

        Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

        conn = DriverManager.getConnection("jdbc:cubrid:localhost:33000:demodb:::","","");

 

        String sql = "SELECT carinfo FROM user_info";

        stmt = conn.createStatement();

        rs = (CUBRIDResultSet)stmt.executeQuery(sql);

        while(rs.next()) {

            // 데이터 타입이 SET인 경우 아래와 같이 getCollection을 사용.

            // 아래는 OID SET이므로 CUBRIDOID 의 배열에 값을 저장.

            CUBRIDOID[] car = (CUBRIDOID[])rs.getCollection("carinfo");

            // API를 통해 SET 값에서 한가지 값을 지우고 다른 값을 입력.

            for(int i=0; i<car.length; i++) {

                car[i].addToSet("color","갈색");    // 1

                car[i].removeFromSet("color","흰색");           // 2

            }

        }

        rs.close();

        stmt.close();

    } catch ( SQLException e ) {

        System.err.println(e.getMessage());

    } catch ( Exception e ) {

        System.err.println(e.getMessage());

    } finally {

        if ( conn != null ) conn.close();

    }

    }

}

·      1 addToSet(column_name, set_element) 함수를 이용하여 SET Type 컬럼의 원소를 추가한다. Collection Type SEQUENCE Type인 경우에는 addToSequence(column_name, index, set_element) 함수를 사용한다.

·      2 removeFromSet(column_name, set_element) 함수를 이용하여 SET Type 컬럼의 원소를 삭제한다. Collection Type SEQUENCE Type인 경우에는 removeFromSequence(column_name, index) 함수를 사용한다.

- car 테이블

name                  spec                  color

==============================================

  '그랜져'              '3000CC'         {'갈색', '검정색', '은색'}

  '쏘나타'              '2000CC'         {'갈색', '상아색', '은색'}


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
21 Java JDBC를 사용한 다중화 구성 SELECT Query 부하 분산 가이드 file 윤준수 2017.03.30 3814
20 Java tomcat8.0(DBCP2)과 CUBRID 연동하기 손승일 2016.07.01 15295
19 Java CUBRID에서 Java AddBatch 사용 엄기호 2016.06.28 8229
18 Java CUBRID와 MyBATIS 빠르게 연동하기 file 김승훈 2015.05.07 19018
17 Java CUBRID와 Oracle의 Clob 타입 사용 방법 비교. seongjoon 2012.06.30 54397
16 Java SELECT ~ FOR UPDATE 대체 방법 손승일 2009.12.30 32324
15 Java CUBRID Java Stored Procedure와 DB Server Memory 관계 file 손승일 2009.10.31 40186
14 Java QuantumDB Eclipse Plugin을 사용하여 CUBRID연동하기 2 cubebridge 2009.10.06 28902
13 Java CUBRID JDBC에서 유니코드 사용하기 1 손승일 2009.08.15 27425
» Java CUBRID Collection Data Type 사용하기 - JDBC 손승일 2009.08.15 24871
11 Java CUBRID GLO 사용하기 - JDBC 손승일 2009.08.15 23490
10 Java JavaSP SampleCode(Pivot기능) cubebridge 2009.07.28 27546
9 Java log4jdbc를 사용한 JDBC 로그 분석 시난 2009.07.02 36350
8 Java CUBRID에서 log4sql을 사용하자 정병주 2009.06.12 44288
7 Java jsp용 jdbc 샘플입니다. file 시난 2009.05.25 47596
6 Java iBATIS framework with CUBRID file 웁쓰 2009.05.19 54501
5 Java SQuirreL SQL Client에서 CUBRID 사용하기 3 Prototype 2009.04.18 34522
4 Java Power*Architect 에서 CUBRID 사용하기 Prototype 2009.04.18 23874
3 Java AquaDataStudio 에서 CUBRID 사용하기 Prototype 2009.04.18 23662
2 Java Spring framework 사용 예제 admin 2009.04.01 53023
Board Pagination Prev 1 2 Next
/ 2

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales