sql >> Database teknologi >  >> RDS >> Oracle

Hvordan redigerer jeg BLOB'er (indeholder JSON) i Oracle SQL Developer?

Hvis du kører en forespørgsel i SQL Developer 3.1 (og sandsynligvis tidligere udgivelser), der returnerer en BLOB, kan du dobbeltklikke på den særlige BLOB, du er interesseret i, hvor du enten vil blive bedt om at prøve at sende dataene til en ekstern editor eller for at prøve at få den indbyggede SQL Developer-visningskontrol til at forsøge at fortolke dataene som et billede eller som tekst. Dine JSON-data vil sandsynligvis blive vist korrekt, hvis du vælger tekstindstillingen.

Hvis du vil ændre dataene, bliver du dog nødt til at udstede en UPDATE for faktisk at indstille dataene. SQL Developer har ikke funktionaliteten til direkte at redigere LOB-dataene. For eksempel

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

vil opdatere den angivne række med de nye JSON-data, der er kodet ved hjælp af databasens tegnsæt. Hvis du vil gemme dataene i et andet tegnsæt, string_to_raw tager en valgfri anden parameter, der specificerer tegnsættet. Så hvis du vil gemme dataene ved hjælp af UTF-8-tegnsættet, ville du gøre sådan noget her

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

Selvfølgelig, da JSON-data er tekstbaserede, ville du være langt bedre stillet til at gemme dataene i en CLOB, som er designet til at gemme store karakterobjekter. Så kunne SQL Developer (og andre værktøjer) bare vise teksten i stedet for at kræve, at du vælger resultatet og derefter foretager yderligere handlinger for at konvertere det til tekst. Og du behøver ikke at konvertere dataene til RAW for at opdatere dataene i databasen.

Hvis dataene er for lange til string_to_raw at håndtere (hvilket afhænger af tegnsættet og dataene, men vil forekomme når som helst RAW data overstiger 2000 bytes), kan du gemme dataene i en CLOB og konverter det derefter til en BLOB som du bruger til at opdatere tabellen. Det er lidt mere komplekst, men det er mere fleksibelt. I dette eksempel udfylder jeg JSON-dataene til 3200 tegn med et "*" - testdataene er naturligvis ikke længere gyldige JSON, men det er ikke vigtigt i forbindelse med dette spørgsmål.

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. Sådan erklærer du en markør efter startsektionen af ​​en Oracle PL/SQL-procedure

  2. ColdFusion:Flere SQL-sætninger i en forespørgsel?

  3. Bash Script loop gennem MySQL

  4. Eksporter SQLite-forespørgselsresultater til en CSV-fil