Если вы запускаете запрос в 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