BLOBを返すSQLDeveloper3.1(およびおそらく以前のリリース)でクエリを実行する場合、関心のある特定のBLOBをダブルクリックすると、外部にデータを送信するように求められます。エディタを使用するか、組み込みのSQLDeveloperディスプレイコントロールでデータを画像またはテキストとして解釈しようとします。テキストオプションを選択すると、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
文字セットを指定するオプションの2番目のパラメーターを取ります。したがって、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;
/