Blob insert sorgusu
 
Bildirimler
Hepsini Temizle

Blob insert sorgusu  

  RSS
Mehmet ÇELİKKOL
(@MehmetCELiKKOL)
Üye

Merhabalar,

 

Oracle üzerinde deneme adındaki tabloda id ve dosya isimli iki sütunum var. id malumunuz seri olarak numara veriyor. dosya sütununu ise blob alan yaptım ve [insert into deneme Values (1,??????)] şeklinde resim kaydetmek istiyorum. soru işaretleri dosya sütununa gidiyor fakat oraya ne yazmam gerektiğini ve resmi nasıl göstereceğimi bir türlü bulamadım.

 

Konu hakkında fikri olan arkadaşlar  yardımcı olabilirlerse çok sevinirim. 

 

 

Alıntı
Gönderildi : 11/02/2013 11:46
Ugur INAL
(@ugurinal)
Üye

Merhaba,

İlk önce external dosyanın saklanacağı fiziksel
dizini işaret eden directory oluşturulmalı ve bu dizini okuyacak kullanıcıya
read hakkı verilmeli;
 

create or replace directory temp as 'C:\dir_blob';

grant read on directory temp to test; 

blob objeyi tutacak tablo oluşturulur ve başlangıçta
boş lob değeri girilir;
 

CREATE TABLE lob_table (id NUMBER, dosya BLOB); 

Ardından bu harici LOB dosyası ilgili tabloya
aşağıdaki gibi yüklenir. Her bir lob dosyası yüklemesi için aşağıdaki prosedür
kullanılabilir (id değerinin değiştirilmesi şartıyla)
 

DECLARE

  kaynak_lob  BFILE := BFILENAME('temp', 'ornek.gif');

  hedef_lob
BLOB;

BEGIN

  INSERT
INTO lob_table VALUES(1, EMPTY_BLOB())

    
RETURNING dosya INTO hedef_lob;
 

 
DBMS_LOB.OPEN(kaynak_lob, DBMS_LOB.LOB_READONLY);

 
DBMS_LOB.LoadFromFile( DEST_LOB => hedef_lob,

                         SRC_LOB  => kaynak_lob,

                         AMOUNT   => DBMS_LOB.GETLENGTH(kaynak_lob) );

 
DBMS_LOB.CLOSE(kaynak_lob);
 

  COMMIT;

END;

/

CevapAlıntı
Gönderildi : 11/02/2013 12:52
Mehmet ÇELİKKOL
(@MehmetCELiKKOL)
Üye

Cavebınıza teşekkür ederim ve şimdi soracağım şey çok cahilceyse de özür dilerim fakat, PL/SQL developer isimli bir yazılımla çalışıyorum. verdiğiniz sorgu satırlarını bu programda kullanabilirim değil mi?

CevapAlıntı
Gönderildi : 11/02/2013 13:07
Ugur INAL
(@ugurinal)
Üye

elbette kullanabilirsiniz.

CevapAlıntı
Gönderildi : 11/02/2013 13:12
Mehmet ÇELİKKOL
(@MehmetCELiKKOL)
Üye
Söylediğinizi yaptım karşıma çıkanları sizinle de paylaşayım; 
 
ORA-22285: non-existent directory or file for fileopen operation
ORA-06512: at "SYS.DBMS_LOB",line 1014
ORA-06512: atline 7
view program sources of errır stack?
şeklinde bir hata alıyorum.
Yes'e tıkladığımda da  dbms.lob sekmesi açılıyor, 1. satırında create or replace package body dbms_lob wrapped yazıyor ikinci satırdan itibaren de 74. satıra kadar aşağıdaki karakterler var;
 
 a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
b
a486 1432
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
VyhX
 
Oracle kullanmamış bir programcı olarak ilk defa kendimi bu kadar bilgisiz hissettim. 
CevapAlıntı
Gönderildi : 11/02/2013 13:20
Ugur INAL
(@ugurinal)
Üye

pl/sql kodunu buraya post atarmısın? 

CevapAlıntı
Gönderildi : 11/02/2013 13:46
Mehmet ÇELİKKOL
(@MehmetCELiKKOL)
Üye

sizin verdiklerinizden kendi tabloma uyarlanmış şekilde aşağıdadır;

 

DECLARE

  kaynak_lob  BFILE := BFILENAME('c:\resim', 'deneme.jpg');

  hedef_lob BLOB;

BEGIN

  INSERT INTO deneme VALUES(1,'rrr','fff', EMPTY_BLOB())

     RETURNING dosya INTO hedef_lob; 

  DBMS_LOB.OPEN(kaynak_lob, DBMS_LOB.LOB_READONLY);

  DBMS_LOB.LoadFromFile( DEST_LOB => hedef_lob,

                         SRC_LOB  => kaynak_lob,

                         AMOUNT   => DBMS_LOB.GETLENGTH(kaynak_lob) );

  DBMS_LOB.CLOSE(kaynak_lob); 

    COMMIT;

END;

 

 

teşekkür ederim. 

CevapAlıntı
Gönderildi : 11/02/2013 13:52
Ugur INAL
(@ugurinal)
Üye

Birinci olarak; BFILENAME içindeki ilk parametre CREATE DIRECTORY ile oluşturulan sanal dizin ismi olacak, fiziksel dizin adı değil! Bendeki örnekte dizin ismi TEMP idi, sedenki neyse o ismi kullan...

İkinci olarak insert kısmında sadece 2 kolon değeri vardı, sende 4 tane var. Senin ilk örneğinde sadece 2 kolon var oluşturulan tabloda... Aşağıda düzelttim, tabi tablondada 2 kolon olduğunu varsayıyorum... Ayrıca okuma hakkını "grant all on directory temp to public" olarak herkese açarmısın bu komutu çalıştırmadan ÖNCE? 

DECLARE

  kaynak_lob  BFILE := BFILENAME('TEMP', 'deneme.jpg');

  hedef_lob BLOB;

BEGIN

  INSERT INTO deneme VALUES(1, EMPTY_BLOB())

     RETURNING dosya INTO hedef_lob; 

  DBMS_LOB.OPEN(kaynak_lob, DBMS_LOB.LOB_READONLY);

  DBMS_LOB.LoadFromFile( DEST_LOB => hedef_lob,

                         SRC_LOB  => kaynak_lob,

                         AMOUNT   => DBMS_LOB.GETLENGTH(kaynak_lob) );

  DBMS_LOB.CLOSE(kaynak_lob); 

    COMMIT;

END;

CevapAlıntı
Gönderildi : 11/02/2013 14:04
Paylaş: