현재 CUBRID2008에서 지원하지 않는 sys_connect_by_path 형식을 Java Stored Procedure와 list, set과 같은 collection함수를 이용하여 원하는 결과 값의 형태를 가져올 수 있도록 하는 sample code를 제공함으로써 사용 개발에 편의를 주고자 한다.
CUBRID2008의 Java Stored Procedure을 사용하기 위해서는 아래의 제품이 우선 설치되어 있어야한다.
1. CUBRID2008R1.1이상 버전을 설치 - http://www.cubrid.com/zbxe/download_2008
2. CUBRID2008의 sample DB인 demodb 설치
3. Java 1.5이상의 버전 - http://java.sun.com/javase/downloads/index.jsp
결과 값으로 나오는 row형태의 데이터를 하나의 칼럼 형태로 보여 주는 것을 목적으로 함. 일반적으로 하나의 테이블에 동일 유형의 값이 들어 있고 이를 하나의 값의 형태로 보고자 할 때 사용됩니다.
demodb는 역대 올림픽의 기록에 대한 정보를 가지고 있다. 여러 테이블 중 ‘game’ 테이블을 선택하여 사용할 것이다.
‘game’테이블에서 1988년 올림픽(host_year=1988)에서 금메달(medal=’G’)을 획득한 나라(nation_code)를 중복 값을 제외하여 구하되 하나의 칼럼으로 ‘-‘구분자를
사용하여 결과 값을 나타내어라.
host_year INTEGER NOT NULL
event_code INTEGER NOT NULL
athlete_code INTEGER NOT NULL
stadium_code INTEGER NOT NULL
nation_code CHARACTER(3)
medal CHARACTER(1)
game_date DATE
select
distinct(nation_code) from game where medal='G' and host_year=1988;
===
<Result of SELECT Command in Line 1> ===
nation_code
======================
'AUS'
'AUT'
...
‘USA'
'YUG'
31 rows
selected.
Current
transaction has been committed.
public
class Pivot {
public static String medal_f(String[] arry,String
str) throws Exception {
String
temp = "";
for(int
i=0 ; i < arry.length ; i++)
temp
+= arry[i] + str;
if(arry.length
!= 0)
temp
= temp.substring(0,temp.length()-str.length());
return temp;
}
}
$javac Pivot.java
$loadjava
demodb Pivot.class
--
demodb 데이터 파일 위치에 java디렉토리 생성여부를 확인하고
해당 디렉토리에 Pivot.class가 있는지 확인한다.
csql>
create function medal_f(arry list, str string) return varchar as language
JAVA NAME 'Pivot.medal_f(java.lang.String[],java.lang.String) return
String';
csql>
;x
Current
transaction has been committed.
1
command(s) successfully processed..
String배열형태의 값은 list나 set을 이용하여 값을 받을 수 있다. 위와 같이 create function 문의 medal_f함수에 인수 값의 형태로 list를 설정하여 function을 생성할 수 있다.
위의 순서에 의해 medal_c라는
function이 등록 되었다. 이를 이용하여 요구사항 대로 ‘-‘로 구분하여 하나의 칼럼으로 결과 값을 가져온다.
select
medal_f(
list(select distinct(nation_code)
from
game where medal='G' and host_year=1988),'-') as NATIOM
from
db_root;
// row단위의 결과 값을 list(sequence)타입으로 받아
온 후 해당 값을 medal_f함수에 넣어 결과 값을 가져온다.
// list대신 sequence타입을 사용해도 동일하다. set을 사용할 경우 distinct가 필요 없다.
===
<Result of SELECT Command in Line 1> ===
NATIOM
======================
'AUS-AUT-BEL-BRA-BUL-CAN-CHN-DEN-ESP-FIN-FRA-FRG-GBR-GDR-HUN-ITA-JPN-KEN-KOR-MAR-NED-NOR-NZL-POL-POR-ROU-SUR-TCH-URS-USA-YUG'
1 rows
selected.
Current
transaction has been committed.
1
command(s) successfully processed.