Q&A

  • [질문] ODAC OraQuery로 오라클 DB BLOB 필드에 각종파일 집어넣기
현재 ODAC를 사용하며 DB는 오라클 DB를 사용중입니다.

지금 BLOB 필드에 실행파일이라던지 엑셀,워드등의 문서 파일들을 집어넣어야 하는데

도무지 해결이 되질 않습니다.

이미지를 집어넣는 부분은 잘 처리됩니다만 일반 파일들은 올라가지 않는군요.

테스트로 넣어본것중 ini 파일 하나는 올라가던데 그 파일 용량은 41byte...

정확히는 모르겠지만 1024BYTE 이상은 올라가지 않도록 되 있는것 같습니다만...

현재 구조는 메인폼에 OraSession 하나를 두고 거기에 쿼리를 연결해서 사용하고 있습니다.

DB에 기존 데이터들은 다 입력되 있는 상태에서 BLOB 데이터만 추가하면됩니다.

<!--CodeS-->

with qryMain do
begin
  SQL.Text := 'UPDATE TBL_DOCUMENTS           ' +
              'SET ATTACHFILE = EMPTY_BLOB()  ' +
              'WHERE ATTACHNO = :ATTACHNO     ' +
              'RETURNING ATTACHFILE           ' +
              'INTO :ATTACHFILE               ';
  try
    Close;
    ParamByName('ATTACHNO').AsString := 'A200808280001';
    ParamByName('ATTACHFILE').ParamType := ptInput;
    ParamByName('ATTACHFILE').Size := 1024000;
    ParamByName('ATTACHFILE').AsBLOBLocator.LoadFromFile(sFileName);
    ExecSQL;
  except;
    OraSession1.RollBack;
    exit;
  end;

  OraSession1.Commit;
end;

<!--CodeE-->

ODAC HELP에 있는 내용을 바탕으로 만들면 이렇습니다만 안 들어가집니다.

ORA-00600, ORA-06502, ORA-06512 에러를 한번에 뱉어내면서..

그래서 Stream 으로 집어넣어봤습니다.

<!--CodeS-->

with qryMain do
begin
  SQL.Text := 'UPDATE TBL_DOCUMENTS           ' +
              'SET ATTACHFILE = EMPTY_BLOB()  ' +
              'WHERE ATTACHNO = :ATTACHNO     ' +
              'RETURNING ATTACHFILE           ' +
              'INTO :ATTACHFILE               ';
  Close;
  fsFile := TFileStream.Create(sFileName, fmOpenRead or fmShareDenyRead);
  try
    fsFile.Seek(0, soFromBeginning);
    msFile := TMemoryStream.Create;
    try
      msFile.CopyFrom(fsFile, fsFile.Size);
      ParamByName('ATTACHNO').AsString := 'A200808280001';
      ParamByName('ATTACHFILE').ParamType := ptInput;
      ParamByName('ATTACHFILE').Size := 1024000;
      ParamByName('ATTACHFILE').AsOraBlob.LoadFromStream(msFile);
      ExecSQL;
    finally
       msFile.Free;
    end;
  finally
    
    fsFile.Free;
  end;

  OraSession1.Commit;

end;

<!--CodeE-->

Code는 게시판에 직접 친거라 조금 다를수도 있지만

이런식으로도 만들어봤으나 마찬가지 결과가 나옵니다.

Blob 스트림을 만들어봐도 안되고...

이미지는 잘 들어가는데 다른 파일들만 이런 문제가 생기니 원...

FTP로 처리할려니 추후 DB 백업하고 재설치할때라던지

그런때 이중으로 작업이 들어가게 되니 하기가 좀 그렇군요.
(급한대로 FTP로 하라고는 하는데 이전 개발자가 그런 정신으로 해놔서 이 따위로 개판 쳐둔걸 따라할 수는 없죠...)

모든 DB는 오라클을 사용하면서 정작 오라클 아는 직원은 한사람도 없으니 물어볼 수도 없고...
(나보고 어쩌라고... 나도 처음인데...ㅡ_ㅡ)

혹시 처리해 보신분 계시면 조언 좀 부탁드립니다.





잡설. 이번 달에도 월급 안주면 나가버릴테다...
7  COMMENTS
  • Profile
    박성준 2008.08.28 19:39
    BLOB Data의 최대크기는 2GB라고 합니다.
  • Profile
    이정욱 2008.08.28 20:01
    그런데, 큰 Blob필드가 많을 수록 퍼포먼스가 급격히 떨어지는 것으로 알고 있습니다.

    그래서 퍼포먼스가 중요한 곳은 보통 파일 서버에 따로 올리게 설계를 합니다.

    그래도 저장이 안되는 것은 조금 이상하네요.

    작은 파일은 잘 들어간다고 하시니, 코드상의 문제 같지 않습니다.

    오라클의 전역 환경 설정 쪽을 한번 살펴봐 보세요.

    아마 그쪽에 Blob필드의 최대 크기를 정해주는 곳이 있었던 걸로 기억합니다.
  • Profile
    소울해커 2008.08.28 22:43

    이 테이블은 그다지 사용 빈도수가 높지 않습니다.

    1년에 한두건 생기면 많이 생기는 정도...

    한번에 BLOB로 들어가는 파일용량도 많아봐야 1MB를 안 넘구요.

    그리고 오라클 SQL Developer에선 BLOB 크기를 잡는 부분을 찾질 못했습니다.

    BDE Administrator에서 ORACL 드라이버에 BLOB 크기를 잡을 수 있는게 있어서 그걸 맞춰봤지만 똑 같더군요.

    오라클 SQL Developer에서 테이블 수정시에 Storge Options도 건드려 봤지만 반응없고...

    Lob Parameters의 Chunk 값이나 Extents 값들은 이리 저리 바꿔 볼려니

    테이블이 수정상태가 아니라서 변경할수 없단 에러메세지가 나오길래

    쿼리로 직접 ALTER 시켜 볼려고 했지만 이것도 구문이 안 맞는다고 그러고...ㅡ_ㅡ
  • Profile
    이정욱 2008.08.30 01:31
    ParamByName('ATTACHFILE').BlobType := ftOraBlob; 을 size 넣는 부분 위에 넣으면 어떻게 되나요...?

    오라클이 안깔려있어서 테스트는 못해봤지만....
  • Profile
    소울해커 2008.08.30 03:59
    에러가 발생합니다.


    ...;

    반은 농담입니다. ㅎㅎ;

    해당 프로퍼티는 없습니다.

    Blob 란게 덩치큰(?) 2진 데이터 형식을 말하는거니 따로 형식을 잡아줄 리는 없겠죠.

    아무래도 BLOB 한 필드당 올라갈 수 있는 데이터 크기가 잡혀있는것 같은데 그걸 수정할 방법을 못찾겠습니다.

    더 이상한건 여기 저기 뒤져보니 오라클에선 따로 설정하지 않으면

    기본적으로 32KB에서 1000KB까지로 잡힌다고 나와있던데

    왜 1KB 이하 용량만 업로드되는지...;
  • Profile
    이정욱 2008.08.30 07:14
    아... 포럼을 뒤져 봤더니...

    We have fixed several problems with BLOBs in recent ODAC builds. You should upgrade your ODAC to the last build of ODAC 5 (5.80.0.42) or ODAC 6 (6.10.0.9).

    이런 내용이 있네요...

    현재 사용하고 계시는 ODAC의 버전이 어떻게 되시는지요?
  • Profile
    소울해커 2008.08.30 18:27
    4.10.0.9 버전입니다.

    이 버전에 문제가 있어서 안올라가는 걸까요?

    단순히 버전의 문제면 새 버전을 설치해버리면 그만이긴 한데...;

    일단은 새 버전을 받아서 해보죠.

    도움 감사합니다.
    • 이은주
      2008.09.03 22:15
      아이 이건 좀 우습게 끝났네요. 해당 팩키지를 넣어주는 것으로 해결이 나는군요. require 에 명시적으...
    • 임형호
      2008.09.03 20:15
      데이타를 파란색으로 뿌려지게 한 조건이 있을거라고 생각이됩니다. 즉.. 그리드1, 그리드2 의 데이타...
    • 델만세
      2008.09.03 22:50
      색깔은 그리드1에 데이터들이 빠진게 있나 확인하려고 넣는건데요.. 그리드1에 OnDrawCell 함수에 ...
    • 임형호
      2008.09.04 01:36
      제가 이해가 안되는건지.. ㅡㅡ;; 1. 색깔은 그리드1에 데이터들이 빠진게 있나 확인하려고 넣는건데...
    • 델만세
      2008.09.04 08:04
      제가 말을 잘 못한거 같네여;;; 그리드1,2에서 뿌려질때 3뿌려지는데.. 예를 들어) 그리드1 에 ...
    • 임형호
      2008.09.04 18:28
      그리드 3에 값을 꼭 그리드1, 2에 넣을때 같이 생성해야되는게 아니라면.. 그리드 1,2 값을 일단 다 넣...
    • 델만세
      2008.09.05 22:00
      이거..프로시저를 하나 만들어서.. 뿌려진 값들을 비교를 해야 할거 같은데요.. 코딩면에서 좀 난간 하...
    • 임형호
      2008.09.06 02:19
      limhyungho@nate.com 요거 제 네이트온 아이디입니다. 5일근무라 내일은 쉬구요. 해결안되시면 다음주...
    • • • •
    • 이정욱
      2008.09.04 18:33
      R01_APDATE 필드의 데이터 타잎이 String 인거 같은데, DateTime 형으로 사용하려고 하는 것 같습니다. ...
    • 박교범
    • 2008.09.02 12:05
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.09.02 17:17
      좀 전에 하나 적었다가 지우고 다시 적네요. 구글에 많이 나와 있습니다. http://support.microsof...
    • 박교범
    • 2008.09.02 12:06
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.09.02 06:35
      품에 패널을 하나 두고 그 위에 내부 컨트롤들을 배치하고 OnResize에서 Panel1.ScaleBy 를 이용하...
    • 김명일
    • 2008.09.02 00:53
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.09.02 01:15
      전역 변수의 경우 기본값은 False 입니다. 정확히 말하자면 0으로 클리어 시키기 때문에 0 = False 이...
    • 석주현
      2008.09.02 01:22
      선언시 초기값 이 부분 같은 경우는 명확하게 초기화 해주는 습관이 좋을 거라 봅니다. 타 언어를 배...
    • 델만세
    • 2008.09.01 22:47
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 소울해커
      2008.09.02 01:05
      begin for idx := 0 to RealGrid.RowCount -1 do begin RealGrid.Cells[const_checkbox, i...
    • 인레인
    • 2008.09.01 20:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2008.09.02 18:04
      dxdbgrid는 어디제품인가요? ㅡㅡ;;
    • 델코이
    • 2008.08.30 05:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • steps
      2008.08.30 06:07
      ''' + FormatDateTime('yyyy-mm-dd', DateTimePicker2.Datetime) + ''''; SQLText := SQLText + 'or...
    • 임형호
      2008.09.01 18:17
      SaveToFile 메쏘드를 그냥 실행해보면 DataSet 즉 adoQuery가 close 상태에서는 안되는것 같은데요. 에러...
    • 민영창
    • 2008.08.29 23:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 민영창
      2008.08.30 03:28
      자체해결했습니다. SpeedVB라는 프로그램이 있네요,, VB를 위해서 나온건데 .5 버젼부터는 스크롤이 안되...
    • 델코이
    • 2008.08.29 21:19
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2008.08.29 22:13
      '요기'에 아래와 같은식으로 코딩해서 넣으세요. FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date)...
    • 델코이
      2008.08.29 22:35
      답변 감사합니다^^ 하지만...결과물이..나오지 않습니다.. adoquery에 sql문 넣는 곳도 다 해봤는데......
    • 최용일
      2008.08.29 23:27
      글쎄요... 결과물이 나오지 않는것까지는 제가 모르죠... 날자를 QuotedStr으로 묶어보세요. QuotedStr...
    • 임형호
      2008.08.30 01:26
      파라메타로 넣는게 없으니.. 일단 memo 값은곳에다가 Query.Sql.text 문장을 찍어보시고 그걸 직접 db...
    • 정경철
    • 2008.08.29 18:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정경철
      2008.08.29 19:38
      QuotedStr 함수를 써서 해결 했습니다. 이런 함수가 있었는지 처음 알았습니다. ^^ QuotedStr(Strin...
    • 이상인
    • 2008.08.28 19:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.08.28 19:58
      MainForm에서 사용된 컴포넌트가 무엇인지 알아야 할것 같네요. 가장 큰 가능성은... 백신이나 기타 ...
    • 박성준
      2008.08.28 19:39
      BLOB Data의 최대크기는 2GB라고 합니다.
    • 이정욱
      2008.08.28 20:01
      그런데, 큰 Blob필드가 많을 수록 퍼포먼스가 급격히 떨어지는 것으로 알고 있습니다. 그래서 퍼포먼...
    • 소울해커
      2008.08.28 22:43
      이 테이블은 그다지 사용 빈도수가 높지 않습니다. 1년에 한두건 생기면 많이 생기는 정도... 한...
    • 이정욱
      2008.08.30 01:31
      ParamByName('ATTACHFILE').BlobType := ftOraBlob; 을 size 넣는 부분 위에 넣으면 어떻게 되나요...? ...
    • 소울해커
      2008.08.30 03:59
      에러가 발생합니다. ...; 반은 농담입니다. ㅎㅎ; 해당 프로퍼티는 없습니다. Blob 란게 ...
    • 이정욱
      2008.08.30 07:14
      아... 포럼을 뒤져 봤더니... We have fixed several problems with BLOBs in recent ODAC builds. Yo...
    • 소울해커
      2008.08.30 18:27
      4.10.0.9 버전입니다. 이 버전에 문제가 있어서 안올라가는 걸까요? 단순히 버전의 문제면 새 버전...
    • 델코이
    • 2008.08.27 21:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2008.08.28 01:52
      데모 프로그램이 없나요? 처음에 공부할때는 그만한게 없어보입니다.
    • 이정욱
      2008.08.27 10:46
      양병규님께서 만드신 비주얼멘더 라는것이 있습니다. 그것의 소스를 참고 하시면 도움이 되실 것 같네요 ^^
    • 바람의아빠
      2008.08.27 23:30
      정욱님 답변 감사합니다.. 나중에 소스 분석 해봐야겠네요..^^
    • 남기섭
    • 2008.08.27 03:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.08.27 10:49
      음.. 한글 정렬 문제 없었던것 같은데요... 어떻게 어떤식으로 구현하셨는지 조금 더 자세한 정보가 있어...
    • 남기섭
      2008.08.31 08:38
      테이블-프로바이더-클라이언트데이타셋-데이타소스 이렇게 연결되어있는데 필드값이 한글일때 클라이언...
    • 초보임당
      2008.09.02 02:33
      자답... 서버 문제 였네요.. db 서버에서 한글 메세지 리턴이 안되네요...사용자 함수 만들어서 사용했...