* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
Window7 32bit | |
[cubrid_rel] 9.2 | |
큐브리드 메니저 2013.09 | |
java |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
데이터베이스를 교체를 해보기 위해 테스트 중입니다.
프로시저 / 함수 에 대한 처리 오류 입니다.
이클립스를 사용하여 컴파일 된 class 파일을 등록 한 후 처리 했는데 오류가 납니다.
ResultSet를 리턴 받는 함수 를 구현 하는데 먼지 모르겠네요.
테스트 용으로 작성한 자바소스코드 입니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import cubrid.jdbc.driver.CUBRIDResultSet;
public class Usp_Test{
public static ResultSet GetResult(int dumyRow){
String cntSql = "SELECT count(*) as cnt FROM Table1";
Connection conn = null;
ResultSet rs = null;
PreparedStatement stmt = null;
try {
//conn = DriverManager.getConnection("jdbc:default:connection:");
String url = "jdbc:cubrid:localhost:33000:TestDB:::";
Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
conn = DriverManager.getConnection(url,"dba","password");
int cnt = 0;
int rnm = dumyRow;
PreparedStatement cntstmt = conn.prepareStatement(cntSql);
ResultSet cntrs = cntstmt.executeQuery();
cntrs.next();
cnt = cntrs.getInt("cnt");
cntrs.close();
cntstmt.close();
if(dumyRow - cnt <= 0)
rnm = 0;
else
rnm = dumyRow - cnt;
String sql = "SELECT IDX, DUMY,'더미테스트' AS DUMY1 FROM DUMY_ROW WHERE IDX <= "+rnm+" UNION ALL SELECT ROWNUM AS IDX1, PRO,DES FROM TABLE2 WHERE ROWNUM <= " + dumyRow;
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
((CUBRIDResultSet)rs).setReturnable();
return rs;
} catch (Exception e) {
e.printStackTrace();
}
finally{
}
return null;
}
}
아래는 CUBRID_JDBC.JAR 참조한 내용입니다.
아래 처럼 데이터베이스에 로드 시켜
아래처럼 작성 FUNCTION 을 작성 했습니다.
CREATE FUNCTION
fn_test(dumyRow BIGINT)RETURN OBJECT
AS LANGUAGE JAVA
NAME 'Usp_Test.GetResult(int) return cubrid.sql.CUBRIDOID'
질의 실행 결과 아래와 같은 오류가... (예제 보고 따라 해본건데....)
타입이 맞지 않다고 하는거 같은데 ...
머가 잘못 된건가요?
위 내용 커서를 빼먹어서 다시 해봤습니다.
CREATE FUNCTION
getshtables_all()RETURN CURSOR
AS LANGUAGE JAVA
NAME 'usp_get_sh_tables.GetAll() return cubrid.jdbc.driver.CUBRIDResultSet'
그래서 자바에서 다시 이전에 커서로 작성한 펑션을 예제를 기반으로 해보았습니다.
코드는 아래와 같습니다.
public class Program {
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
conn = DriverManager.getConnection("jdbc:CUBRID:localhost:33000:SHDB:::?charSet=utf-8","dba","PASSWORD");
CallableStatement cstmt = conn.prepareCall("?=CALL getshtables_all()");
cstmt.registerOutParameter(1, Types.JAVA_OBJECT);
cstmt.execute();
ResultSet rs = (ResultSet) cstmt.getObject(1);
while(rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
결과는 rs 가 null 로 나오게 됩니다..
커서로 작성한 펑션의 자바class는 아래와 같습니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import cubrid.jdbc.driver.CUBRIDResultSet;
public class usp_get_sh_tables {
public static ResultSet GetAll(){
String query = "SELECT * FROM sh_tables";
Connection conn = null;
ResultSet rs = null;
PreparedStatement stmt = null;
try {
//String url = "jdbc:cubrid:localhost:33000:SHDB:::?charSet=utf-8";
String url = "jdbc:cubrid:localhost:33000:SHDB:::?charSet=utf-8";
Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
conn = DriverManager.getConnection(url,"dba","PASSWORD");
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
((CUBRIDResultSet)rs).setReturnable();
return rs;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
}
--------------------------------------------
추가 내용입니다.
.net 에서 해당 데이터를 읽어 올 경우 한글 데이터 자체가 깨지는 현상이 있습니다.
검색 결과 해당 큐브리드ado.net 9.2 버전 자체가 문제가 있다고 확인 했는데
해당 바이너리를 받아 검색 해도 똑같은 현상이 발생 합니다.
데이터베이스 콜레이션은 ko_kR.utf8 입니다.
아래는 큐브리드 매니저로 검색 해본 결과 입니다.
잘 보입니다.
자료를 검색하는 CubridADo.net 바이너리 참조 url은 아래와 같습니다.
ftp://ftp.cubrid.org/CUBRID_Drivers/ADO.NET_Driver/9.2.0/
에서 9.2.0.0002.zip 을 다운받아 프로젝트에 참조 해서 사용 했습니다.
다음은 큐브리드 프로바이더를 이용하여 데이터 셋을 리턴 하는 내용입니다.
다음은 검색 후 리스판스로 찍어본 결과 값입니다.
다 깨짐니다.
다음은 C#에서 자료를 인서트 해보았습니다.
매니저로 검색 해 보았습니다. 한글 깨짐니다.
해당 내용까지 다시 읽어 리스판스로 찍어 보았습니다.
해당 문자는 정상적으로 출력이 됩니다.
하 ㅠㅠ..
안녕하세요.
아래와 같이 추가 질문 사항을 정리하였으니 확인 부탁 드립니다.
1. DUMY_ROW 테이블의 스키마를 알려주세요.
추가로, 함수의 경우 리턴값은 반드시 1개여야 합니다. [QnA 큐브리드에서 함수와 프로시저의 차이]를 참고하셔서 해당 함수가 리턴값을 항시 1개만 받는 것인지 확인 부탁 드립니다.
2. 어떤 게시글을 참고하셨는지요?
9.2 ADO.net Provider에서 문제가 되었던 것은 dll 파일 참조 추가 시 정상적으로 로드하지 못하는 문제였습니다.
말씀하신 오류 내용과, 확인하신 사항은 조금 다른 것으로 보입니다.
일단, DB의 한글셋을 UTF-8로 하셨다고 말씀해 주셨으니, ASP.NET의 web.config 파일에서 인코딩을 UTF-8로 지정하여 확인 부탁 드립니다.
감사합니다.