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 119
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4475
1020 이중화 구성시 펑션 class 위치 1 secret 차차오 2015.10.19 9
1019 이중화 모드에서 cubrid changemode 가 안먹을때 확인 방법이 있나요? 4 coolkkm 2017.12.15 388
1018 이중화 씨 락상태가 30분 정도 걸려있다가 재기동 하면 바로 안올라오나요? 3 coolkkm 2017.12.14 264
1017 이중환 관련 질문 드립니다. 2 jojosale 2013.12.05 8402
» 이진 데이터를 Stored Procedure에 넘기는 방법 7 hyperhand 2009.12.23 14060
1015 이클립스 DBViewer에서 1분정도 지나면 컨넥션이 끊어집니다. 2 천타에 허리한번 펴자 ㅡㅡ; 2009.06.04 16332
1014 인덱스 scan 문의합니다 1 모모 2020.10.07 204
1013 인덱스 관련 문의입니다. 1 wook 2020.09.10 72
1012 인덱스 사용 관련하여 문의드립니다. 1 neighbor 2023.12.12 113
1011 인덱스 함수 생성 문의 1 후후후후후후후후 2021.09.01 434
1010 인덱스가 가끔 깨집니다. 도와주세요. 2 훈이아빠 2017.11.21 1651
1009 인덱스가 많이 설정된 데이터 삭제시 오래 걸리는지 여부 1 나라디 2022.06.29 188
1008 인덱스가 실행이 안되는 것 같아서 요청 드려 봅니다. 3 취우다 2017.04.15 9772
1007 인덱스를 엉뚱한 걸 타고 있습니다??! 9 file Philip Park 2020.11.26 301
1006 인서트 시 IX_LOCK 문의 1 joke7 2016.03.14 7715
1005 인코딩 관련 1 song 2008.12.17 21518
1004 인코딩 문의. 1 우페 2008.12.09 19219
1003 인코딩 문제와 권한 문제입니다. 1 싸댕 2016.12.15 15534
1002 인터프리터 로그 남기는 설정 문의드립니다. 1 sspark 2018.01.10 237
1001 일반사용자 시스템 테이블 접근 권한 제어관련 질문드립니다. 1 dkhwang 2020.07.03 316
Board Pagination Prev 1 ... 145 146 147 148 149 150 151 152 153 154 ... 200 Next
/ 200

Contact Cubrid

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