Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

मैं Oracle SQL डेवलपर में BLOB (JSON युक्त) कैसे संपादित करूं?

यदि आप 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;
/


  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 SQL - RANK () या DENSE_RANK () या ROW_NUMBER () विश्लेषणात्मक फ़ंक्शन का उपयोग करके अलग-अलग पंक्तियाँ कैसे प्राप्त करें?

  2. एसक्यूएल डेवलपर में CONCAT

  3. SQL में डेटाबेस तालिका में 'शून्य नहीं' मान अपडेट करते समय मैं एक त्रुटि कैसे फेंकूं?

  4. जावा से ओरेकल डीबी में डालने की तारीख

  5. सिंगल एसक्यूएल चयन एक टेबल पंक्ति से कई पंक्तियों को लौटा रहा है