sql >> Database >  >> RDS >> Oracle

Hoe bewerk ik BLOB's (met JSON) in Oracle SQL Developer?

Als u een query uitvoert in SQL Developer 3.1 (en waarschijnlijk eerdere releases) die een BLOB retourneert, kunt u dubbelklikken op de specifieke BLOB waarin u geïnteresseerd bent, waar u wordt gevraagd om te proberen de gegevens naar een externe editor of om te proberen het ingebouwde SQL Developer-weergavebesturingselement de gegevens te laten interpreteren als een afbeelding of als tekst. Uw JSON-gegevens worden waarschijnlijk correct weergegeven als u de tekstoptie kiest.

Als u de gegevens echter wilt wijzigen, moet u een UPDATE uitgeven om de gegevens daadwerkelijk in te stellen. SQL Developer heeft niet de functionaliteit om de LOB-gegevens rechtstreeks te bewerken. Bijvoorbeeld

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
 WHERE primary_key = <<some value>>

zal de opgegeven rij bijwerken met de nieuwe JSON-gegevens die zijn gecodeerd met behulp van de databasetekenset. Als u de gegevens in een andere tekenset wilt opslaan, string_to_raw neemt een optionele tweede parameter die de tekenset specificeert. Dus als je de gegevens wilt opslaan met de UTF-8-tekenset, doe je zoiets als dit

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
 WHERE primary_key = <<some value>>

Omdat JSON-gegevens tekstueel zijn, kunt u de gegevens natuurlijk veel beter opslaan in een CLOB die is ontworpen om grote objecten op te slaan. Dan kan SQL Developer (en andere tools) de tekst gewoon weergeven in plaats van dat u het resultaat moet selecteren en vervolgens aanvullende acties moet ondernemen om het naar tekst te converteren. En u hoeft de gegevens niet te converteren naar RAW om de gegevens in de database bij te werken.

Als de gegevens te lang zijn voor string_to_raw om te verwerken (wat afhangt van de tekenset en de gegevens, maar zal optreden wanneer de RAW gegevens groter zijn dan 2000 bytes), kunt u de gegevens opslaan in een CLOB en zet dat vervolgens om in een BLOB die u gebruikt om de tabel bij te werken. Dat is iets ingewikkelder, maar het is flexibeler. In dit voorbeeld vul ik de JSON-gegevens op tot 3200 tekens met een '*'-- uiteraard zijn de testgegevens niet langer geldige JSON, maar dat is niet belangrijk voor de doeleinden van deze vraag.

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. mysql fulltext zoeken mislukt

  2. Laravel Query Builder WHERE NOT IN

  3. atomaire vergelijking en swap in een database

  4. PDO Transactie-instructie met uitvoerfout bij invoegen en ophalen