2012-03-16 16 views
7

मैं पाठ की बड़ी पर्वत के साथ एक बूँद को अद्यतन करने रहा हूँ और मैं इस त्रुटि मिलती है:मैं एसक्यूएल डेवलपर में "कच्ची परिवर्तनीय लंबाई बहुत लंबी" त्रुटियों से कैसे बच सकता हूं?

SQL Error: ORA-06502: PL/SQL: numeric or value error: raw variable length too long 

वहाँ इसके चारों ओर कोई तरीका है?

टेक्स्ट 2,670 वर्ण लंबा है, utl_i18n.string_to_raw के माध्यम से परिवर्तित किया जा रहा है, जैसा कि How do I edit BLOBs (containing JSON) in Oracle SQL Developer? में बताया गया है, और सभी क्वेरी में एक पंक्ति पर हैं।

अद्यतन: प्रश्न में बीएलओबी में पहले से ही टेक्स्ट शामिल है जो 2,686 वर्ण लंबा है, जो उस पाठ से लंबा है जिसे मैं सम्मिलित करने की कोशिश कर रहा हूं।

+0

संभव डुप्लिकेट [मैं BLOBs (JSON युक्त) Oracle SQL डेवलपर में कैसे संपादित करूं?] (Http://stackoverflow.com/questions/9218474/how-do-i-edit-blobs-containing- json-in-oracle-sql-developer) –

+1

मैंने अपने उत्तर को अन्य थ्रेड में अपडेट किया ताकि कुछ और जटिल दृष्टिकोण शामिल हो जो 'utl_i18n.string_to_raw' फ़ंक्शन का उपयोग कर अधिक लचीला हो। –

उत्तर

6

RAW 2000 बाइट तक सीमित है। यदि आपका डेटा उससे अधिक लंबा है, तो आपको इसे CLOB में संग्रहीत करने की आवश्यकता होगी और फिर CLOB को BLOB में कनवर्ट करना होगा, दुर्भाग्यवश, string_to_raw फ़ंक्शन कुछ और जटिल है। ऐसा कुछ ऐसा मानने पर काम करेगा कि आप पूरी स्ट्रिंग को CLOB वैरिएबल पर असाइन कर सकते हैं, जब तक कि स्ट्रिंग 32676 बाइट से कम हो। यदि यह उससे अधिक लंबा है, तो आपको CLOB पर टुकड़ों में लिखना होगा और फिर BLOB में कनवर्ट करना होगा।

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); 
    update json_data 
    set data = l_blob; 
end; 
/
की
+0

यह काम करता है, लेकिन क्यों 'rpad'? मुझे 'rpad' की लंबाई को उस स्ट्रिंग की लंबाई तक सेट करने की आवश्यकता है जिसे मैं सम्मिलित कर रहा हूं। क्या 'rpad' का उपयोग न करके ऐसा करने का कोई तरीका है? – Xonatron

+1

@ मैथ्यूडौकेट - आपको 'आरपीएडी' का उपयोग करने की आवश्यकता नहीं है। मैं बस 3200 वर्ण स्ट्रिंग उत्पन्न करने के लिए अपने उदाहरण में इसका उपयोग कर रहा था क्योंकि मैं लंबे समय तक एक स्ट्रिंग में टाइप करने के लिए बहुत आलसी हूं और एसओ पोस्ट में ऐसी स्ट्रिंग को प्रारूपित करने में दर्द होगा। –

+0

आह, मुझे यह मिल गया। बहुत बहुत धन्यवाद। बहुत बढ़िया मदद! – Xonatron

0

मुझे लगता है कि समस्या यह है कि कॉलम में डालने वाला डेटा कॉलम के डेटाटाइप के लिए बहुत बड़ा है। कृपया उस मान को चेक करें जिसे आप कॉलम में सम्मिलित करने का प्रयास कर रहे हैं और फिर कॉलम डेटाटाइप अपडेट करें।

+0

क्या आप निश्चित हैं? बीएलओबी में पहले से ही टेक्स्ट है जो टेक्स्ट को सम्मिलित करने की कोशिश कर रहा है उससे बड़ा है। मेरे लिए, यह एक SQL डेवलपर (इंटरफ़ेस) मुद्दा बनाता है, डेटाबेस समस्या नहीं। – Xonatron

+0

यदि यह एक है, तो यह 'utl_i18n.string_to_raw' की अधिकतम सीमा से संबंधित हो सकता है। – Xonatron