Как редактировать 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;
/