* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
|
|
Windows, LINUX, UNIX, MacOS |
|
|
10.1, 10.2, 11.0, 11.2 |
|
|
|
|
|
JDBC |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
| 에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
| 관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
시스템 카탈로그 db_partition의 컬럼 partition_values의 데이터 타입이 SEQUENCE OF인데,
이 데이터타입을 JDBC ResultSet 에서 조회하는 방법을 알고 싶습니다.
아래와 같은 테이블을 생성한 후 db_partition 딕셔너리를 조회했습니다.
CREATE TABLE sh2.tb_partition_range (
host_year INT,
nation CHAR(3),
gold INT,
silver INT,
bronze INT
)
PARTITION BY RANGE (host_year) (
PARTITION before_2000 VALUES LESS THAN (2000),
PARTITION before_2008 VALUES LESS THAN (2008),
PARTITION before_2010 VALUES LESS THAN (2010),
PARTITION before_2020 VALUES LESS THAN (2020),
PARTITION others VALUES LESS than maxvalue
);
getString("partition_values")를 실행하면 오류가 발생합니다.
cubrid.jdbc.driver.CUBRIDException: Type conversion error[CAS INFO-####,4,31],[SESSION-8],[URL-jdbc:cubrid:####].
at cubrid.jdbc.jci.UGetTypeConvertedValue.getString(UGetTypeConvertedValue.java:268)
at cubrid.jdbc.jci.UStatement.getString(UStatement.java:1579)
at cubrid.jdbc.driver.CUBRIDResultSet.getString(CUBRIDResultSet.java:332)
at cubrid.jdbc.driver.CUBRIDResultSet.getString(CUBRIDResultSet.java:584)
getObject("partition_values")도 TypeConversion 에러가 납니다.
데이터 타입이 SEQUENCE OF인데, JDBC 드라이버에서 getTimestamp 메소드를 를 호출하는 것도 미스터리네요.
파티션 키 컬럼이 INT 타입이고 테이블에는 INT와 CHAR 타입 컬럼밖에 없습니다.
cubrid.jdbc.driver.CUBRIDException: Type conversion error[CAS INFO-####,4,31],[SESSION-7],[URL-jdbc:cubrid:####].
at cubrid.jdbc.jci.UGetTypeConvertedValue.getTimestamp(UGetTypeConvertedValue.java:295)
at cubrid.jdbc.jci.UStatement.getTimestamp(UStatement.java:1607)
at cubrid.jdbc.driver.CUBRIDResultSet.getTimestamp(CUBRIDResultSet.java:506)
at cubrid.jdbc.driver.CUBRIDResultSet.getTimestamp(CUBRIDResultSet.java:632)
at iFlow.lib.database.MyResultSet.getObject(MyResultSet.java:300)
cast(partition_values as varchar)도 사용할 수 없군요.
Casting db_partition.partition_values to type varchar is not supported.
어떻게 해야 할까요.
두 가지 방법을 알려 주시면 좋겠습니다.
1. SQL에서 VARCHAR로 변환해 추출하는 방법
2. JDBC에서 getXXX를 사용하는 방법
감사합니다.
db_partition에서 partition_values의 row data를 사용하려는 것으로 보입니다.
1. SQL에서 LIST를 VARCHAR TYPE으로 변환 하는 함수는 없는 것으로 알고 있습니다.
2. 그러므로 List에 경우 아래 코드와 같이 getObject를 받으셔서 object type에 따라 result값을 변환하여 사용하시면 되며,
정상적으로 데이터를 받을 수 있을 것 같습니다.
아래와 같은 코드가 의도가 아니라면 문제의 java코드를 전달해 주시면 추가로 분석하여 드리도록 하겠습니다.
==========================================================
ResultSet rs = null;
Statement stmt = null;
String sql = "select * from db_partition where class_name = 'tb_partition_range' and owner_name = 'sh2'";
System.out.println(sql);
try {
stmt = conn.createStatement();
boolean ret = stmt.execute(sql);
if (ret) {
rs = stmt.getResultSet();
if (rs != null) {
while (rs.next()) {
Object obj = rs.getObject("partition_values");
if (obj != null) {
System.out.println("obj : " + obj.getClass().getSimpleName());
if (obj instanceof Integer[]) {
Integer[] arrayResult = (Integer[]) obj;
if (arrayResult == null || arrayResult.length == 0) {
System.out.println("Array is empty or null.");
} else {
for (int i = 0; i < arrayResult.length; i++) {
System.out.println("result" + "[" + i + "]" + arrayResult[i]);
String stringRet = String.valueOf(arrayResult[i]);
System.out.println("stringRet : " + stringRet);
}
}
}
}
}
}
}