Если вы запускаете запрос в SQL Developer 3.1 (и, возможно, более ранних выпусках), который возвращает BLOB, вы можете дважды щелкнуть по нужному BLOB, где вас попросят, либо попытаться отправить данныево внешний редактор или попытаться использовать встроенный элемент управления дисплеем SQL Developer для интерпретации данных в виде изображения или текста.Ваши JSON-данные, вероятно, будут отображаться правильно, если вы выберете текстовую опцию.
Однако, если вы хотите изменить данные, вам нужно будет ввести UPDATE
, чтобы фактически установить данные.У разработчика SQL нет возможности напрямую редактировать данные больших объектов.Например,
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;
/