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