함수/저장프로시저 타입 오류 관련 문의합니다.(ado.net한글깨짐 포함 수정)

by 아이쿠두야 posted Jan 01, 2014

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
OS
Window7 32bit
CUBRID Ver.
[cubrid_rel] 9.2
CUBRID TOOL Ver.
큐브리드 메니저 2013.09
응용 환경(API)
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 참조한 내용입니다.


1.png


아래 처럼 데이터베이스에 로드 시켜

2.png 


아래처럼 작성 FUNCTION 을 작성 했습니다.


CREATE FUNCTION 

fn_test(dumyRow BIGINT)RETURN OBJECT 

AS LANGUAGE JAVA 

NAME 'Usp_Test.GetResult(int) return cubrid.sql.CUBRIDOID'


질의 실행 결과 아래와 같은 오류가... (예제 보고 따라 해본건데....)

타입이 맞지 않다고 하는거 같은데 ... 

머가 잘못 된건가요? 

3.png


위 내용 커서를 빼먹어서 다시 해봤습니다.


CREATE FUNCTION 

getshtables_all()RETURN CURSOR 

AS LANGUAGE JAVA 

NAME 'usp_get_sh_tables.GetAll() return cubrid.jdbc.driver.CUBRIDResultSet'


해서
it can not return ResultSet 오류가 나네요...
추가적인 오류 사항을 확인 할 수 없어 어디가 잘 못 되었는지 알 수 없습니다. 

ResultSet 같은 데이터 집합은  Cubrid매니저에서는 안되는게 맞는 건가요?


그래서 자바에서 다시 이전에 커서로 작성한  펑션을 예제를 기반으로 해보았습니다.

코드는 아래와 같습니다.


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 입니다.


아래는 큐브리드 매니저로 검색 해본 결과 입니다.

잘 보입니다. 

44.png


자료를 검색하는 CubridADo.net  바이너리 참조 url은 아래와 같습니다.

ftp://ftp.cubrid.org/CUBRID_Drivers/ADO.NET_Driver/9.2.0/

에서 9.2.0.0002.zip 을 다운받아 프로젝트에 참조 해서 사용 했습니다.


다음은 큐브리드 프로바이더를 이용하여 데이터 셋을 리턴 하는 내용입니다.

1.png


다음은 검색 후 리스판스로 찍어본 결과 값입니다.

다 깨짐니다.

3.png


다음은 C#에서 자료를 인서트 해보았습니다.

66.png


매니저로 검색 해 보았습니다.  한글 깨짐니다.

55.png


해당 내용까지 다시 읽어 리스판스로 찍어 보았습니다.

77.png

해당 문자는 정상적으로 출력이 됩니다.


하 ㅠㅠ..






Articles