Как редактировать BLOB (содержащие JSON) в Oracle SQL Developer?

Как редактировать BLOB-объекты (содержащие текст JSON) в Oracle SQL Developer?

Я могу открывать и просматривать их, но нужен ли мне внешний редактор для их редактирования? Любая помощь в том, что использовать, даже если это просто блокнот, и как это сделать, будет очень признательна за ответ.

EDIT: BLOB-объекты, о которых идет речь, содержат текст JSON.


person Xonatron    schedule 09.02.2012    source источник


Ответы (2)


Если вы запускаете запрос в SQL Developer 3.1 (и, возможно, в более ранних версиях), который возвращает BLOB, вы можете дважды щелкнуть конкретный BLOB, который вас интересует, где вам будет предложено либо попытаться отправить данные на внешний редактор или попытаться заставить встроенный элемент управления отображением SQL Developer интерпретировать данные как изображение или как текст. Ваши данные JSON, вероятно, будут отображаться правильно, если вы выберете текстовую опцию.

Однако, если вы хотите изменить данные, вам придется ввести UPDATE, чтобы фактически установить данные. SQL Developer не имеет функций для прямого редактирования данных больших объектов. Например

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
 WHERE primary_key = <<some value>>

обновит указанную строку новыми данными JSON, закодированными с использованием набора символов базы данных. Если вы хотите сохранить данные в другом наборе символов, string_to_raw принимает необязательный второй параметр, указывающий набор символов. Итак, если вы хотите хранить данные с использованием набора символов UTF-8, вы должны сделать что-то вроде этого

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
 WHERE primary_key = <<some value>>

Конечно, поскольку данные JSON являются текстовыми, вам было бы гораздо лучше хранить данные в CLOB, который предназначен для хранения больших объектов символов. Тогда SQL Developer (и другие инструменты) может просто отображать текст, а не требовать от вас выбора результата, а затем выполнять дополнительные действия для преобразования его в текст. И вам не нужно было бы преобразовывать данные в RAW, чтобы обновить данные в базе данных.

Если данные слишком длинные для обработки string_to_raw (что зависит от набора символов и данных, но будет происходить каждый раз, когда данные RAW превышают 2000 байт), вы можете сохранить данные в CLOB, а затем преобразовать его в BLOB, который вы использовать для обновления таблицы. Это немного сложнее, но более гибко. В этом примере я дополняю данные JSON до 3200 символов с помощью «*» — очевидно, что тестовые данные больше не являются действительными JSON, но это не важно для целей этого вопроса.

declare
  l_blob        blob;
  l_clob        clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*');
  l_amt         integer := dbms_lob.lobmaxsize;
  l_dest_offset integer := 1;
  l_src_offset  integer := 1;
  l_csid        integer := dbms_lob.default_csid;
  l_ctx         integer := dbms_lob.default_lang_ctx;
  l_warn        integer;
begin
  dbms_lob.createTemporary( l_blob, false );
  dbms_lob.convertToBlob( l_blob,
                          l_clob,
                          l_amt,
                          l_dest_offset,
                          l_src_offset,
                          l_csid,
                          l_ctx,
                          l_warn );

  -- You'll want to add a WHERE clause as well
  update json_data
     set data = l_blob;

  dbms_lob.freeTemporary( l_blob );
end;
/
person Justin Cave    schedule 09.02.2012
comment
Хорошо, я отредактировал BLOB и получил текст, который хотел. Как выполнить UPDATE с этим текстовым файлом? Подключи меня сюда, и я буду знать, как все это сделать! - person Xonatron; 10.02.2012
comment
@MatthewDoucette - обновил мой ответ примером оператора UPDATE. - person Justin Cave; 16.03.2012
comment
классно. Позвольте мне попробовать ее!! - person Xonatron; 16.03.2012
comment
кажется, что это работает, но теперь я получаю эту ошибку, если вы можете помочь мне с ней: stackoverflow.com/questions/9743084/ Это относится к этому вопросу, если вы хотите добавить это к своему ответу. Большое спасибо. - person Xonatron; 16.03.2012
comment
это странно, так как текст, который я использую, имеет длину всего 2368 символов, что не превышает ограничения в 4000 байт. Заставляет меня задуматься, что вызывает ошибку raw variable length too long. Однако большое спасибо за это решение. - person Xonatron; 16.03.2012
comment
@JusticCave, почему вы используете rpad для (вообще)? - person Xonatron; 16.03.2012
comment
Мне пришлось установить длину rpad на точную длину текста, который я вставлял, но это сработало! - person Xonatron; 16.03.2012
comment
@MatthewDoucette - вам вообще не нужно использовать RPAD. Я просто использовал его для создания строки из 3200 символов, так как мне было лень набирать допустимый кусок JSON длиной 3200 символов. - person Justin Cave; 16.03.2012
comment
@MatthewDoucette - На самом деле я ошибся - максимальная длина RAW составляет 2000 байт, а не 4000. Обновлен мой ответ, чтобы отразить это. - person Justin Cave; 16.03.2012
comment
Как я полагаю, createTemporary творения удаляются в конце скрипта? Это так очевидно, но я просто хотел перепроверить. - person Xonatron; 19.03.2012
comment
@MatthewDoucette - они освобождаются, когда локальная переменная выходит за пределы области видимости. Я добавил вызов dbms_lob.freeTemporary в конце скрипта просто для гигиены кода. - person Justin Cave; 19.03.2012

Если вы хотите изменить отдельные большие двоичные объекты без написания кода SQL, вы можете сделать это в Oracle SQL Developer:

  1. Дважды щелкните ячейку с надписью (BLOB). Кнопка редактирования (карандаш вместо значка) должна появиться справа от ячейки. Нажмите здесь.
  2. Нажмите Download справа от Сохраненные данные. Сохраните его где-нибудь.
  3. Отредактируйте файл в любой программе. Сохранять.
  4. Вернувшись в диалоговое окно «Редактировать значение» Oracle SQL Developer, нажмите Load справа от Локальные данные. Найдите файл там, где вы его сохранили после редактирования. Нажмите OK в диалоговом окне "Редактировать значение".
  5. Нажмите кнопку Commit Changes, если вы довольны внесенными изменениями, или кнопку Rollback Changes, если вы передумали.

Я думаю, это намного проще, чем делать все dbms_lob.convertToBlob, если это всего лишь одноразовая вещь.

person ArtOfWarfare    schedule 08.10.2018
comment
Почему иногда ссылка «Загрузить» и весь сеанс «Локальные данные» отключены? Каковы критерии включения этих кнопок? - person zion; 09.05.2020