powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление ячейки столбца с типом BLOB
10 сообщений из 10, страница 1 из 1
Обновление ячейки столбца с типом BLOB
    #40099397
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброй ночи.
Есть таблица table1 со столбцами id INT, img BLOB

В таблицу загружены 30 записей. Первый столбец id, второй фотки в формате blob.

Есть id = 20
Нужно по id = 20 обновить img ячейку на новый jpg файл из локального компа.
Мне нужен именно UPDATE.
INSERT не подходит.
Подскажите код, спасибо заранее.
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099402
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

docs.oracle.com update

SQLPLUS:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
$ ls -l tech.jpg 
-rw------- 1 lejnin lejnin 932 авг 25 18:21 tech.jpg

$ od  -t x1 tech.jpg | cut -c9-255 | tr -d "[ \n]"
ffd8ffe000104a46494600010101009000900000ffdb0043000201010201010202020202020202030503030303030604040305070607070706070708090b0908080a0807070a0d0a0a0b0c0c0c0c07090e0f0d0c0e0b0c0c0cffdb004301020202030303060303060c0807080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc00011080010001003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00fd58d7ff006c0d4fc49a7fed31acd8ebfa5f847c1df0cec57c2fa1788752286da1f10c30dcb5e4af1985a63e5cf7161088fcb956530830890c8c95f3d7fc131bfe0afbe3bf8a5f143c37f0efe2d68f75a9cfe3181dfc3be22b0d1de39ef19659c334f144be5bdb831491f9f0a2ac46d9bcd047992c795fb59ffc12d3e2b7ed1df19fe2378ef43f0b7833c2da4ffc24515d5b78326d5e71078f96d12e3fe26570d0482386e2e0c851573030173397789c34d71f42fecaf65fb46695fb40e95a8f8f3e1df80b47f873aad8dde99a5693a55cd9fdb7e185a4213c9b71246a3cf8aebecf6e1922675dc913e2dd63f24fc946a63e78a8b9734526fa36a49c9efb592564bed2df64d9fd3388c0707e1b873111a2b0f5ead4a71959d5a74ea519c284528d392e7756729f354a966a949a704bda4a34dfffd9

$ sqlplus user/pass

SQL> create table dropme_blob ( id number, img blob );

Table created.

SQL> variable v_blob blob;
SQL> execute dbms_lob.createtemporary(:v_blob,false);

PL/SQL procedure successfully completed.

SQL> execute dbms_lob.append(:v_blob,hextoraw('ffd8ffe000104a46494600010101009000900000ffdb0043000201010201010202020202020202030503030303030604040305070607070706070708090b0908080a0807070a0d0a0a0b0c0c0c0c07090e0f0d0c0e0b0c0c0cffdb004301020202030303060303060c0807080c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0cffc00011080010001003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00fd58d7ff006c0d4fc49a7fed31acd8ebfa5f847c1df0cec57c2fa1788752286da1f10c30dcb5e4af1985a63e5cf7161088fcb956530830890c8c95f3d7fc131bfe0afbe3bf8a5f143c37f0efe2d68f75a9cfe3181dfc3be22b0d1de39ef19659c334f144be5bdb831491f9f0a2ac46d9bcd047992c795fb59ffc12d3e2b7ed1df19fe2378ef43f0b7833c2da4ffc24515d5b78326d5e71078f96d12e3fe26570d0482386e2e0c851573030173397789c34d71f42fecaf65fb46695fb40e95a8f8f3e1df80b47f873aad8dde99a5693a55cd9fdb7e185a4213c9b71246a3cf8aebecf6e1922675dc913e2dd63f24fc946a63e78a8b9734526fa36a49c9efb592564bed2df64d9fd3388c0707e1b873111a2b0f5ead4a71959d5a74ea519c284528d392e7756729f354a966a949a704bda4a34dfffd9'))

PL/SQL procedure successfully completed.

SQL> print                  

V_BLOB
--------------------------------------------------------------------------------
FFD8FFE000104A46494600010101009000900000FFDB004300020101020101020202020202020203
0503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C0709

SQL> select length(:v_blob) from dual;

LENGTH(:V_BLOB)
---------------
	    932

SQL> insert into dropme_blob values (1,null);

1 row created.

SQL> update dropme_blob set img=:v_blob where id=1;

1 row updated.

SQL> commit;

Commit complete.

SQL> select * from dropme_blob;

	ID
----------
IMG
--------------------------------------------------------------------------------
	 1
FFD8FFE000104A46494600010101009000900000FFDB004300020101020101020202020202020203
0503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C0709


SQL> 

SQL> drop table dropme_blob purge;

Table dropped.
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099409
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin,

Как это можно компановать в виде:
CREATE OR REPLACE PROCEDURE uploadImage(id NUMBER, path_to_file VARCHAR) AS
BEGIN
....
....
END;

?
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099447
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin,

Вы сразу взяли файл tech.jpg в формате:

FFD8FFE000104A46494600010101009000900000FFDB004300020101020101020202020202020203
0503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C0709

И загрузили через execute dbms_lob.append.
А если нужно указать путь к файлу, откуда будет сделан Load?
Процедура, которой указываешь id и путь к файлу jpg_file_path. Она загружает файл по указанному пути, обновляет соответствующую ячейку по id.
Как такую процедуру сделать?
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099451
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin,

Спасибо, нашел.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE TABLE tab1 (
  id        NUMBER,
  b_data BLOB
);

------------------------------------------------------------------------------
CREATE OR REPLACE DIRECTORY BLOB_DIR AS 'C:\JPG_DIR';
------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE updateJPG(file_id NUMBER, file_name VARCHAR) AS
  l_bfile  BFILE;
  l_blob   BLOB;
  l_dest_offset INTEGER := 1;
  l_src_offset  INTEGER := 1;
BEGIN
  SELECT b_data
  INTO   l_blob
  FROM   tab1
  WHERE  id = file_id
  FOR UPDATE;
  
  l_bfile := BFILENAME('BLOB_DIR', file_name);
  DBMS_LOB.fileopen(l_bfile, DBMS_LOB.file_readonly);
  DBMS_LOB.trim(l_blob, 0);
  DBMS_LOB.loadblobfromfile (
    dest_lob    => l_blob,
    src_bfile   => l_bfile,
    amount      => DBMS_LOB.lobmaxsize,
    dest_offset => l_dest_offset,
    src_offset  => l_src_offset);
  DBMS_LOB.fileclose(l_bfile);
END;



Тема закрыта.
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099458
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

Тема закрыта.

авторфайл из локального компа.

фотка не на сервере?

.....
stax
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40099506
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

Я намекнул, что загрузка зависит от клиента, который Вы используете
Вы же не уточнили чем вы пользуетесь :)

Например sqldeveloper или PL/SQL Developer умеют это делать

Чтобы загрузить blob, вам надо его передать в клиент как blob
sqlplus - текстовая консоль, поэтому я и передавал данные как текст

Найденная Вами процедура, будет исполняться как pl/sql на сервере, соотвественно, директория, откуда она грузить файлы, тоже находится там же.
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40100039
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Я пока тестирую на локальном компе, где установлен Oracle. В будущем процедура будет работать на сервере. Админ БД в курсе, создаст там директорию когда придет время.
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40100041
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возник такой вопрос.
Если файлы находятся на сервере, загрузкой файлов в ячейку BLOB не проблема.
А если клиентская программа выбирает со своего локального диска, вызывает хранимую процедуру и передает файл, тогда как хр.процедура получит файл?

У меня единственная мысль, это изменить хр.процедуру, чтобы в параметре IN принимала не путь к файлу, а сам файл в формате BLOB.
К примеру клиент написан на Java, это толстый клиент. Пользователь нажимает Открыть, выбирает файл, нажимает Загрузить, клиент вызывает хр.процедуру и передает файл в формате binary.
Есть другие варианты?
...
Рейтинг: 0 / 0
Обновление ячейки столбца с типом BLOB
    #40100120
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

Мессир, возможны два варианта:
Вариант первый, разовые задания администратором, или пользователем.
Для этого используются стандартные инструменты разработчика/администратора: SqlDeveloper, PL/SQL developer

Либо SQLCL script

Вариант второй, задача в составе приложения, как штатная функциональность,
В этом случае загрузка blob - задача разработчиков приложения
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление ячейки столбца с типом BLOB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]