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 122
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4476
1362 큐브리드 매니저 사용법 문의 2 유진욱 2018.10.24 552
1361 SELECT FETCH 문제 3 초보123 2018.03.07 552
1360 큐브리드 9.3 버전에서 dba 암호 분실시 어떻게 해야 하나요? 1 하늘나무 2018.07.04 551
1359 매일 1억건의 데이터를 지울수 있는 방법이 필요합니다 14 file ysh 2021.04.20 551
1358 큐브리드 매니저 9.3 인데요 모니터링 툴에서 데이터베이스 추가를 몇개까지 할수 있나요? 1 coolkkm 2017.09.26 549
1357 트리거, 프로시져 조회 문의 1 해리맥 2021.12.23 549
1356 날짜 데이터 변환 1 옐인 2019.07.03 547
1355 한글 컬럼 comments 변경은 어떻하는거죠? 아무리 봐조 모르겠습니다. 1 덴드로비움 2020.09.09 547
1354 Edit Host 에러 (bad record MAC) 8 file 알고싶어요 2021.08.16 546
1353 failed to initialize broker shared memory 5 정민영 2020.11.04 544
1352 cubrid.conf 설정 질문 드립니다. 2 지옥성녀은비 2019.11.12 539
1351 특정 Table만 백업하는 방법 1 nagh 2021.01.06 538
1350 JDBC Driver로 부터의 오류메시지에 대한 질의 3 Fe2 2022.06.22 536
1349 select 쿼리 case변경 문의 3 yodongky 2017.08.18 535
1348 CUBRID-PHP-10.2-latest.tar.gz 설치 ../src/cci/cci_util.c:53:34: error: libregex38a/regex38a.h: No such file or directory 4 함마칙스 2020.07.29 534
1347 함수 사용시 max, min 값 문의 4 kipo0821 2020.01.20 533
1346 CUBRID Manager 오류 메시지 및 드라이버 버전에 따른 접속(DB 접근) 문제 3 뽀대남 2021.01.15 533
1345 CUBRID 11.2 쿼리 성능 이슈 13 tree1891 2022.08.02 532
1344 DB 이중화 관련 Clob 데이터는 어떻게 해야 하나요? 1 광합성 2018.01.16 522
1343 우분투 부팅시 cubrid 서버 자동 실행 8 정민영 2020.06.19 520
Board Pagination Prev 1 ... 128 129 130 131 132 133 134 135 136 137 ... 201 Next
/ 201

Contact Cubrid

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