Background Image

FORUM

조회 수 14060 추천 수 0 댓글 7
?

단축키

Prev이전 문서

Next다음 문서

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

아래와 같이 테이블을 생성했습니다.

CREATE TABLE TBL_DATA_LOG
(
 FLD_DATE CHAR(28) NOT NULL,
 FLD_DATA_SIZE INTEGER NOT NULL,
 FLD_DATA BIT VARYING(2048) NOT NULL,
 FLD_SZ1 INTEGER NOT NULL,
 FLD_SZ2 INTEGER NOT NULL,
 FLD_SZ3 INTEGER NOT NULL
)

아래와 Java Stored Procedure를 작성했습니다.

import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.ByteArrayInputStream;
import java.sql.*;

public class SP_InsertBinary

 public static void InsertBinary(int cont_data_size, byte [] cont_data, int sz1, int sz2, int sz3) throws SQLException
 {
  try
  {   
   String sql = "INSERT INTO TBL_DATA_LOG(FLD_DATE, FLD_DATA_SIZE, FLD_DATA, FLD_SZ1, FLD_SZ2, FLD_SZ3) VALUES (?, ?, ?, ?, ?, ?);";
   
   Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
   Connection con = DriverManager.getConnection("jdbc:default:connection:::");
   PreparedStatement pstmt = con.prepareStatement(sql);
   
   Date da = new Date();
   SimpleDateFormat dt = new SimpleDateFormat("yyyyMMddHHmmss");
   String today = dt.format(da);
   
   pstmt.setString(1, today);
   pstmt.setInt(2, 10);
   
   ByteArrayInputStream bas = new ByteArrayInputStream(cont_data, 0, cont_data_size);
   pstmt.setBinaryStream(3, bas, cont_data_size);
   
   pstmt.setInt(4, sz1);
   pstmt.setInt(5, sz2);
   pstmt.setInt(6, sz3);
   
   pstmt.executeUpdate();
   
   pstmt.close();
   con.close();
  }
  catch(Exception e)
  {
   System.err.println(e.getMessage());
  }
 }
}

작성한 소스를 컴파일하고, 아래와 같이 클래스를 로드 및 등록했습니다.

loadjava TestDB SP_InsertBinary.class

CREATE PROCEDURE InsertBinary
(
 cont_data_size int,
 cont_data bit varying,
 sz1 int,
 sz2 int,
 sz3 int
)
as LANGUAGE JAVA
NAME 'SP_InsertBinary.InsertBinary(int, byte[], int, int, int)';

그리고 테스트 해보기 위해 아래와 같이 작성했습니다.
call InsertBinary(5, X'0A1B2C3D4F', 1, 2, 3);

그런데 위와 같이 하면 에러가 발생합니다.
Stored Procedure execute error : java.lang.NullPointerException

아무래도 제가 테스트를 잘못 하는 듯 싶은데 왜 저런 에러가 발생할까요?

그리고 loadjava 명령으로 로드한 클래스를 언로드 하는 방법이 있나요?

  • ?
    seongjoon 2009.12.23 08:48
    byte[] 때문에 생기는 문제로 보입니다.
    소스코드에 main 부분을 만들어서 실행시켜보니,
    byte val = (byte) 0x000FF;  InsertBinary(5, val, 1, 2, 3); 는 에러가 생기고,
    byte[] val = {(byte) 0x000FF, (byte)0x0000000FF};  InsertBinary(5, val, 1, 2, 3); 는 정상적으로 실행이 되네요.
    또한, byte[]는 CUBRID의 SP에서 지원되지 않으니 byte를 인수로 받도록 소스코드에 수정이 필요할 것으로 보입니다.
  • ?
    hyperhand 2009.12.23 18:07
    답변 감사합니다^^
    늦게까지 계시네요. 퇴근하셨을 줄 알고 다음날 확인해야겠다고 생각했는데.

    지금 큐브리드를 이용하면서 가장 큰 issue가 c++/c#과 연동하여 바이너리 데이터를 insert, select하는 것인데요,
    select는 사용하는데 무리없음을 확인했는데, insert가 해결이 안되네요.
    insert를 Stored Procedure를 통해서 처리하려고 했는데, 이런 내용을 참고할 수 있을만한 자료나 사이트 혹시 알고 계신곳 있으신가요? 아님 Stored Procedure를 사용하지 않고도 처리하는 방법도 상관없구요.
  • ?
    hyperhand 2009.12.23 19:43
    프로시저를 생성하는 부분을 보면
    CREATE PROCEDURE InsertBinary
    (cont_data_size int, cont_data bit varying, sz1 int, sz2 int, sz3 int) as LANGUAGE JAVA
    NAME 'SP_InsertBinary.InsertBinary(int, byte[], int, int, int)';
    에서 bit varying이 byte[] 타입과 매칭되는 거 아닌가요?
    bit varying 타입으로 생성했으니 테스트할때도 X'A1B23B4CA5' 이런식으로 실행해도 되는거 아니에요?
  • ?
    hyperhand 2009.12.24 03:15

    저도 아래와 같이 main 함수 만들어서 테스트 해봤습니다.

    import java.io.ByteArrayInputStream;
    import java.sql.*;

    public class StoredJDBC
    {
     public static void main(String [] args) throws SQLException
     {
      try
      {
       Connection con = null;
       Statement stmt = null;
       int result;
       int i;
       
       Class.forName("cubrid.jdbc.driver.CUBRIDDriver");
       con = DriverManager.getConnection("jdbc:CUBRID:localhost:33000:TestDB:::", "id", "pwd");
       
       CallableStatement cs;
       cs = con.prepareCall("call InsertBinary(?, ?, ?, ?, ?)");
       
       byte [] data = {0x35, (byte)0xaa, (byte)0xac, 0x16, (byte)0x98};
       ByteArrayInputStream bas = new ByteArrayInputStream(data, 0, 5);
       
       cs.setInt(1, 5);
       cs.setBinaryStream(2, bas, 5);
       cs.setInt(3, 1);
       cs.setInt(4, 2);
       cs.setInt(5, 3);
       
       cs.executeUpdate();
       
       con.commit();
       cs.close();
       con.close();
      }
      catch(Exception e)
      {
       System.err.println(e.getMessage());
      }
     }
    }

    이렇게 해도 동일한 에러가 발생하는데 어떻게 하셨단 말씀이세요?
    ByteArrayInputStream 말고 다른 방법으로 해야 하나요?

  • ?
    hyperhand 2009.12.24 07:57
    아무리 해봐도 안되네요ㅜㅜ
    바이너리 데이터 필드를 문자열형(char or varchar)으로 변경하면 되긴 하는데
    데이터 중간에 0이 들어가면 데이터가 잘려버려서 안되네요.
    아쉽지만 그냥 마음 편하게 상용DB를 써야 할 것 같네요.
  • ?
    seongjoon 2009.12.23 08:50
    두번째 답변입니다.
    loadjava를 하게 되면, %CUBRID_DATABASES%TBL_Testjava 에 class 파일이 추가되게 됩니다.
    특별히 unlaod하는 방법은 없으며, 위의 경로에 추가된 파일을 삭제하시고 다시 loadjava를 하면 됩니다.
  • ?
    문학청년 2010.01.11 23:15
    위의 소스 코드에 특정 함수를 추가하여 우회적으로 해결하는 방법을 찾아봤습니다..
    자세한 사항은 아래 링크 문서에서 확인하시기 바랍니다.

    http://cafe.naver.com/studycubrid/553

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 30
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4456
3992 회원가입이 3명이상 안돼요.. 1 딩이 2010.07.08 7846
3991 회사 서버에 접속을 할려면 설정이 다른가요? 2 후니 2009.07.14 10577
3990 홈경로 databases.txt 질문드립니다 1 큐브리드드 2023.07.17 92
3989 홀따옴표 처리 문의 1 초보 2010.04.15 14679
3988 혼합형 데이터 정렬방법 1 큐키 2021.06.11 85
3987 혼합형 데이터 정렬 방법 1 큐키 2021.06.14 265
3986 혹시 큐브리드매니저 자동완성 끄는 기능 있나요 2 안지민 2012.09.05 6036
3985 혹시 큐브리드 매니져 기본글꼴을 고정폭으로 해주실 생각은 없으신가요... 1 안지민 2012.12.20 5768
3984 혹시 PHP5.3.0 버전에서 모듈 설치되신분 계신가요??? 4 senseplus 2009.07.13 9394
3983 혹시 MMDB 지원하나요? 1 tekkal 2009.01.31 17480
3982 호스트 추가시 발생되는 오류에 대해 문의 합니다. 1 거북이사촌 2015.01.06 5259
3981 호스트 추가 질문입니다. 7 몽유객 2010.12.21 13808
3980 호스트 추가 1 karay2k 2011.12.17 17928
3979 호스트 연결이 안됩니다. 3 file 미드소나 2013.01.01 7752
3978 호스트 연결이 안되요.(비밀번호오류) 2 양희종 2011.09.06 13919
3977 호스트 연결이 무한 로딩도네요 1 file 큐브리드사용자 2022.10.20 119
3976 호스트 연결이 되지 않습니다. 3 file Juooon 2013.07.24 9235
3975 호스트 연결 에러 3 secret PJEPJE 2016.01.28 10
3974 형변환 오류 문의 1 삽질중 2009.12.30 12969
3973 현재 큐브리드 7.1 을 사용하고 있는데요 1 헬리 2009.10.01 8770
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 200 Next
/ 200

Contact Cubrid

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