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
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4443
3987 tomcat7 + cubrid 1 깽즈야 2012.07.27 91019
3986 원격접속이 안되네요????????? 2 Chris 2013.07.23 89530
3985 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다 1 바람바람 2013.05.29 84888
3984 CUBRID 7.3 + zeroboard XE 관리자 로그인 에러 1 윤희서 2009.01.17 83642
3983 cub_master: Cannot bind local address... aborting.... Address already in use 4 박상현 2008.11.28 83564
3982 큐브리드 다운로더 오류 발생 5 file 차오이 2008.11.22 78483
3981 zeroboard XE 설치시 'database connect fail' error 4 윤희서 2009.01.16 78164
3980 Image 데이터타입 사용방법 3 AD 2008.11.25 73850
3979 clob 문의 1 김해영 2012.11.29 73008
3978 linux server 환경에서 php 버전은 어떤걸로 선택해야하는지. 1 거기 2008.11.30 66366
3977 델파이에서는 어떻게 사용할수 있을까요? 2 이상원 2008.11.29 65567
3976 if exists 조건 처리문? 2 콩이아부지 2013.03.06 63606
3975 update 쿼리를 이용한 시리얼 수정에 관하여 1 인경수 2008.11.27 63453
3974 큐브리드 2008 설치시 윈도우 서비스에 등록되지 않습니다. 3 file 진이 2008.11.22 63170
3973 CUBRID 7.3 + zeroboard XE 관리자 로그인 에러 1 윤희서 2009.01.17 62130
3972 큐브리드 maven repository 관련 문의 3 StoneHouse 2013.04.30 61468
3971 메니저에서 접속 안되는 오류 2 유나인 2013.08.16 61067
3970 .NET DB 제어를 위한 방법. 2 우페 2008.11.23 60878
3969 JDK가 두개 설치된 경우 선택적으로 JDK를 설정 할 수 있는 방법은 없는지요 1 GoFly 2008.11.28 60615
3968 데이터 이관시 소유자 변경 가능한가요??? 1 델몬트 2013.08.08 60066
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