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

  1. CUBRID 사용자를 위한 DBeaver 도구 출시 안내

    Date2024.04.23 Byadmin Views104
    read more
  2. SQLGate for CUBRID 영구 무료 라이선스 제공

    Date2020.04.09 Byadmin Views4468
    read more
  3. 이기종간 DB Link 문의 드립니다.

    Date2023.09.26 Bykikiki767 Views104
    Read More
  4. 이러한 오류가 뜨는 이유가 뭔가요?

    Date2020.11.13 ByUK Views152
    Read More
  5. 이런 형태의 테이블에는 데이터를 어떻게 삽입합니까?

    Date2012.06.25 By푸훗 Views5827
    Read More
  6. 이미지 저장시 오류발생

    Date2015.08.25 ByAramis Views8012
    Read More
  7. 이미지를 한번에 저장 BLOB이용

    Date2013.05.28 Byjhdreamy Views11396
    Read More
  8. 이미지사진파일 업로드 방법

    Date2011.10.10 By우주와나 Views11964
    Read More
  9. 이상한 현상..

    Date2020.06.05 By아악이 Views143
    Read More
  10. 이전 백업 파일 보존이 체크되어 있는데 백업자동화 에서 생성된 파일이 삭제됩니다.

    Date2015.02.09 By김수민 Views12
    Read More
  11. 이전글, 다음글 기능(LAG, LEAD) 과 인덱스 가능 여부나 SQL 개선 질문 드립니다.

    Date2017.04.19 By취우다 Views6835
    Read More
  12. 이전버전 제거시 오류

    Date2008.11.26 Bydoplee Views53102
    Read More
  13. 이전에 질문드렸었는데요.. 중복 제거 쿼리문 재질문드립니다...

    Date2012.08.25 By광황제 Views9117
    Read More
  14. 이젠 매니저가 ㅠㅠ

    Date2009.02.17 By가루구 Views20819
    Read More
  15. 이중 루프문 안에 쿼리문 실행시 바깥루프 안도는 문제

    Date2009.12.22 By지니보이 Views15270
    Read More
  16. 이중화 관련 문의드립니다.

    Date2024.03.12 Byadqwdqwd123412 Views68
    Read More
  17. 이중화 관련 질문 하나 더 드립니다.^^

    Date2009.02.18 Bykkckc Views21293
    Read More
  18. 이중화 관련 추가 질문 드립니다. sync 설정을 관련 질문입니다.

    Date2018.01.11 Bycoolkkm Views245
    Read More
  19. 이중화 관련 추가 질문 드립니다. sync 설정을 관련 질문입니다.

    Date2018.01.11 Bycoolkkm Views235
    Read More
  20. 이중화 관련해서 질문 드립니다.

    Date2021.01.20 By코코코지마 Views366
    Read More
  21. 이중화 구성 DB와 , 단일 구성 DB 의 속도 차이가 있나요? 너무 차이가 나서 질문 올려요

    Date2017.11.02 By덴드로비움 Views863
    Read More
  22. 이중화 구성시 펑션 class 위치

    Date2015.10.19 By차차오 Views9
    Read More
Board Pagination Prev 1 ... 144 145 146 147 148 149 150 151 152 153 ... 200 Next
/ 200

Contact Cubrid

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