Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление ячейки столбца с типом BLOB / 10 сообщений из 10, страница 1 из 1
22.09.2021, 19:36
    #40099397
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление ячейки столбца с типом BLOB
Доброй ночи.
Есть таблица table1 со столбцами id INT, img BLOB

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

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

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

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

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

FFD8FFE000104A46494600010101009000900000FFDB004300020101020101020202020202020203
0503030303030604040305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C0709

И загрузили через execute dbms_lob.append.
А если нужно указать путь к файлу, откуда будет сделан Load?
Процедура, которой указываешь id и путь к файлу jpg_file_path. Она загружает файл по указанному пути, обновляет соответствующую ячейку по id.
Как такую процедуру сделать?
...
Рейтинг: 0 / 0
23.09.2021, 07:15
    #40099451
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление ячейки столбца с типом BLOB
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
23.09.2021, 08:41
    #40099458
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление ячейки столбца с типом BLOB
LiQuid

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

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

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

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

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

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

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

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

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

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

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

Либо SQLCL script

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


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