Я думаю, что, может быть, я начинаю понимать процесс здесь, но это так странно, что я сомневаюсь в себе.Далее см. Комментарии о том, в чем суть путаницы.
DECLARE
srcFile BFILE := BFILENAME('SOME_DIR', 'xyz.pdf');
fLen NUMBER;
dest BLOB;
BEGIN
INSERT INTO SomeTable
VALUES ( 1, 'xyz.pdf', EMPTY_BLOB(), null ) -- Does this establish an active ref.?
RETURNING pdf_file INTO dest;
DBMS_LOB.OPEN(srcFile, dbms_lob.file_readonly);
fLen := dbms_lob.getlength(srcFile);
DBMS_LOB.LOADFROMFILE(dest, srcFile, fLen); -- Does this reach into the table row,
-- and fill it with the file’s contents?
dbms_lob.close(srcFile);
commit;
END;
И есть ли следующий способ обновления BLOB в строке, которая уже существует?
DECLARE
srcFile BFILE := BFILENAME('SOME_DIR', 'xyz.pdf');
fLen NUMBER;
dest BLOB;
BEGIN
SELECT pdf_file INTO dest -- Does this est. an active reference?
FROM SomeTable
WHERE ID = 1; -- ( <———<<< ' = 1' is just for example.)
DBMS_LOB.OPEN(srcFile, dbms_lob.file_readonly);
fLen := dbms_lob.getlength(srcFile);
DBMS_LOB.LoadFromFile(dest, srcFile, fLen); -- Does this reach into the row,
-- filling it w/ the file’s contents?
dbms_lob.close(srcFile);
commit;
END;
Похоже, это больше похоже на обработку .NET адаптеров базы данных и функций FileInfo, DirInfo.Но я не видел такой философии в Oracle где-либо еще.
Я бы ожидал
BLOBVariable = LoadFromFile(srcLocator, byteCnt); -- where the func. rtrns a val,
, следующий за
INSERT INTO SomeTable (pdf_file)
VALUES (BLOBVariable);
Я вижуэто право?Если да, то когда ссылка отменяется?Кажется, я помню, что читал, что 'commit' не нужен при использовании 'LoadFromFile?'
И сегодня утром я вижу пример (без объяснения причин), который выбирает поле BLOB в переменную, используя FOR UPDATEзаблокировать запись.Может быть, хорошо понять, что с этим ...
-- Lock the record
execute immediate 'SELECT pdf_file INTO dest
FROM image_blobs
WHERE itl_image_blob_id = :1
FOR UPDATE'
INTO v_blob_data
using < the row identifier goes here >;
-- Read the file
dbms_lob.loadfromfile(dests, srcFile, fLen);
-- update the blob field
execute immediate '
UPDATE image_blobs
SET pdf_file = :1
WHERE itl_image_blob_id = :2'
using dest, < row identifier >;