Background Image

FORUM

?

단축키

Prev이전 문서

Next다음 문서

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

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
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

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


하 ㅠㅠ..





  • ?
    이용미 2014.01.03 00:15

    안녕하세요.
    아래와 같이 추가 질문 사항을 정리하였으니 확인 부탁 드립니다.

     

    1. DUMY_ROW 테이블의 스키마를 알려주세요.
       추가로, 함수의 경우 리턴값은 반드시 1개여야 합니다. [QnA 큐브리드에서 함수와 프로시저의 차이]를 참고하셔서 해당 함수가 리턴값을 항시 1개만 받는 것인지 확인 부탁 드립니다.
    2. 어떤 게시글을 참고하셨는지요?
       9.2 ADO.net Provider에서 문제가 되었던 것은 dll 파일 참조 추가 시 정상적으로 로드하지 못하는 문제였습니다.
       말씀하신 오류 내용과, 확인하신 사항은 조금 다른 것으로 보입니다.

       일단, DB의 한글셋을 UTF-8로 하셨다고 말씀해 주셨으니, ASP.NET의 web.config 파일에서 인코딩을 UTF-8로 지정하여 확인 부탁 드립니다.

     

    감사합니다.

  • ?
    아이쿠두야 2014.01.03 01:39

    ADO.net Privider 의 커넥션 인코딩을 utf-8로 변환 하여 처리 하니 정상적인 데이터를 확인 했습니다.

    1번의dumy_row 테이블의 스키마는 별거 없이 100개 정도의 공란 행이 들어 있음니다. 키는  자동증가identity 입니다. 자동 증가 행은 키가 되구요. 


    create table DUMY_ROW ( IDX INT NOT NULL IDENTITY PRIMARY KEY, DUMY NVARCHAR(1) NOT NULL DEFAULT ''  ) 

    이렇게요.


    일단 function 자체는 단일 값 만을 반환 한다는 걸 잘 알겠습니다. 스칼라 펑션밖에 안되는 군요.


    mssql에서 데이터베이스를 교체 하기 위해 알아보고 있는 중인데, mssql에서 테이블을 리턴하는 function 이 몇개 있어서 해당 경우를 테스트 하는 코드 였습니다.

    예 mssql :) select * from dbo.fn_GetResult('test') where id='A1'

    from 절이 펑션 입니다.


    위같은 펑션이 안되면 뷰로 대체해야 겠군요..


    프로시저는 언어가 JAVA로만 해야 한다는걸로 아는데.


    MYSQL 처럼 SQL 로 는 작성 되게끔 할 계획은 없나요?



    엄청 번거로울꺼 같네요..  SQL 구문으로 짜여진 많은 쿼리를 다시 자바로 바꾸어 짜서, 컴파일 해서, 등록 하고..


    아, 그리고 같은 사설 네트워크 대역 내에서 192.168.0.xxx 

    큐브리드 서버 의 브로커 포트 30000, 33000 방화벽 해제, 매니저 포트 해제, 한 이후 다른 컴퓨터(같은네트워크 대역)에서 쿼리 브라우저 등으로 접속 해 보는데

    접속이 안되는 경우가 있습니다. 아주 찾지를 못하던데..

    핑도 정상적으로 통하고

    텔넷으로도 접속 확인 됩니다. telnet 192.18.0.큐브리드버 30000 or 33000 (정상 접속 됨)

    쿼리브라우저 또는 응용 프로그램에서 접속 하면 브로커에 접속이 되지 않습니다.


    큐브리드 서버컴퓨터에서 쿼리브라우저, 매니저 켜놓지도 않구요.

    큐브리드 서버쪽 에서 브로커 확인 하면 아이들 상태이구 클로스 웨이트 상태 몇개 있구..

    아이들 상태면 접속 되야 하는거 아닌가요?


    다음에 사진으로 보여 드릴께요.




    답글 감사합니다.




List of Articles
번호 제목 글쓴이 날짜 조회 수
1712 Java 저장 함수/프로시저 문의 1 초도한정 2014.01.03 10376
» 함수/저장프로시저 타입 오류 관련 문의합니다.(ado.net한글깨짐 포함 수정) 2 file 아이쿠두야 2014.01.01 12359
1710 8.3.1 --> 9.2 업그레이드 후 한글 깨짐. ( vb6.0 + MS949 ) 2 한종희 2013.12.28 22688
1709 시스템 오류 코드 193 발생 1 file 규짱 2013.12.26 15430
1708 서버 연결중 연결 대기 시간이 초과하였습니다. 1 남자 2013.12.25 13338
1707 쿼리 브라우져 가져오기 오류 질문 1 joke7 2013.12.24 8783
1706 [연결정보]브로커포트설정 관련 문의. 1 file 씨큐 2013.12.20 11399
1705 Invalid buffer position! 오류 12 알칸펠 2013.12.20 12586
1704 큐브리드에서 제공되는 CUBRIDXADataSource 1 jobis 2013.12.18 9087
1703 lockdb 질문입니다. 1 오니오니 2013.12.17 10648
1702 큐브리드 이중화 관련하여 설정 내용 문의드립니다. 1 신나여 2013.12.17 12185
1701 cm_admin 으로 사용자를 추가해도 쿼리 브라우저에서 접속 불가합니다..도와주세요 1 asuraiv 2013.12.10 11828
1700 csql를 사용하여 스크립트를 돌리게 되면 에러가 납니다. 1 secret 애정결핍 2013.12.10 6
1699 쿼리 브라우져 가져오기 오류 질문 4 joke7 2013.12.08 10820
1698 SQL 인라인뷰 응답속도 개선 문의 6 knight 2013.12.07 13017
1697 다른 질문 드립니다 ~ 3 secret 오니오니 2013.12.06 5
1696 eclipse plugin 설치 에러 1 file 바다~ 2013.12.06 9738
1695 Failed to connect to database server, 'dbname', on the following host(s) 3 뽀다구 2013.12.06 14586
1694 다시 문의 드립니다/.. 6 secret 오니오니 2013.12.06 13
1693 이중환 관련 질문 드립니다. 2 jojosale 2013.12.05 8391
Board Pagination Prev 1 ... 66 67 68 69 70 71 72 73 74 75 ... 156 Next
/ 156

Contact Cubrid

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