यदि आप SQL डेवलपर 3.1 (और शायद पहले के रिलीज़) में एक क्वेरी चलाते हैं जो एक BLOB लौटाती है, तो आप उस विशेष BLOB पर डबल-क्लिक कर सकते हैं जिसमें आप रुचि रखते हैं जहाँ आपको या तो बाहरी को डेटा भेजने का प्रयास करने के लिए कहा जाएगा। संपादक या अंतर्निहित SQL डेवलपर प्रदर्शन नियंत्रण डेटा को छवि या पाठ के रूप में व्याख्या करने का प्रयास करने का प्रयास करने के लिए। यदि आप टेक्स्ट विकल्प चुनते हैं तो आपका JSON डेटा शायद सही ढंग से प्रदर्शित होगा।
हालाँकि, यदि आप डेटा बदलना चाहते हैं, तो आपको एक UPDATE
जारी करना होगा वास्तव में डेटा सेट करने के लिए। SQL डेवलपर के पास 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
एक वैकल्पिक दूसरा पैरामीटर लेता है जो वर्ण सेट को निर्दिष्ट करता है। तो अगर आप यूटीएफ -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 डेवलपर (और अन्य उपकरण) आपको परिणाम का चयन करने की आवश्यकता के बजाय केवल पाठ प्रदर्शित कर सकते हैं और फिर इसे पाठ में बदलने के लिए अतिरिक्त कार्रवाई कर सकते हैं। और आपको डेटा को RAW
. में कनवर्ट नहीं करना पड़ेगा डेटाबेस में डेटा को अपडेट करने के लिए।
यदि डेटा string_to_raw
. के लिए बहुत लंबा है संभालने के लिए (जो चरित्र सेट और डेटा पर निर्भर करता है लेकिन किसी भी समय RAW
. होगा डेटा 2000 बाइट्स से अधिक है), आप डेटा को CLOB
. में स्टोर कर सकते हैं और फिर उसे एक BLOB
. में बदलें जिसका उपयोग आप तालिका को अद्यतन करने के लिए करते हैं। यह थोड़ा अधिक जटिल है लेकिन यह अधिक लचीला है। इस उदाहरण में, मैं '*' के साथ 3200 वर्णों तक JSON डेटा को पैडिंग कर रहा हूं - जाहिर है कि परीक्षण डेटा अब मान्य 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;
/