Forum
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.
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;
/
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?
elbette kullanabilirsiniz.
pl/sql kodunu buraya post atarmısın?
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.
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;