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
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4281
3956 현재 이중화 진행중인 db 를 한쪽을 끊고 이관작업이후 이중화를 붙이면 동기화가 문제가 없나요? 1 coolkkm 2017.10.30 373
3955 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다 1 바람바람 2013.05.29 84860
3954 현재 디비가 조회가 되지 않을정도로 느립니다. 1 file 시리 2019.01.17 240
3953 현재 구축 중인 사이트에 GROUP_CONCAT 쿼리 최적화 관련 문의드립니다 4 인혁 2020.10.21 701
3952 해시분할 문의 2 초보 2010.04.10 9979
3951 해당 ip에만 접속 권한을 주는 기능은 없나요? 1 얀들 2009.07.27 9081
3950 해당 SQL은 어떻게 수정하나요? 1 닥터히어로 2015.11.04 4377
3949 해결 부탁드립니다. 4 file GNS 2017.01.10 14520
3948 함수/프로시져 구동시 필요한 java버젼 1 네오랜덤 2023.03.31 112
3947 함수/프로시저 설정 문제 3 동훈이 2016.09.01 13923
» 함수/저장프로시저 타입 오류 관련 문의합니다.(ado.net한글깨짐 포함 수정) 2 file 아이쿠두야 2014.01.01 12590
3945 함수 실행시 한글 깨짐 현상 4 대규 2011.10.05 11849
3944 함수 생성 문의 1 ozro 2022.06.13 177
3943 함수 생성 관련 문의 1 bnb0165 2021.10.12 76
3942 함수 사용시 한글 깨짐 현상 2 펌피 2016.06.28 10195
3941 함수 사용시 max, min 값 문의 4 kipo0821 2020.01.20 514
3940 함수 사용 에러 1 말큼 2016.03.31 9285
3939 함수 문의 1 amostella 2022.05.18 158
3938 함수 등록한 수 쿼리문에서 사용하면 에러나는데 뭐가 문제인거죠? 3 어려운큐브 2012.05.26 13882
3937 함수 값은 null 체크가 안되나요?? 1 ozro 2022.08.22 54
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 199 Next
/ 199

Contact Cubrid

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