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

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

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

EDIT: рассматриваемые капли содержат текст JSON.

1 ответов


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

если вы хотите изменить данные, тем не менее, вам придется выпустить UPDATE фактически установить данные. Разработчик SQL не имеет возможности напрямую редактировать данные LOB. Например

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, ты бы сделал что-нибудь подобное!--11-->

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;
/