Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да редактирам BLOB (съдържащи JSON) в Oracle SQL Developer?

Ако изпълните заявка в 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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle - актуализира запис и връща актуализирана дата в същата заявка

  2. Помощна програма ADODFCMP

  3. Как да настроите изхода на сървъра на DataGrip

  4. Изпълнете dbms_mview.refresh от CodeIgniter

  5. Материализиран изглед с Oracle