sql - सीओएलबी के लिए ओरेकल में JSON कैसे उत्पन्न किया जाता है, जो> 32k(जैसे 60,000 अक्षर)?



oracle plsql (1)

1) मुझे ऑरेकल चयन क्वेरी से जेसनसन बनाना होगा जो कि तीन तरीकों से मैं अनुसरण कर सकता हूं।

SELECT JSON_ARRAY(json_object('id'         VALUE employee_id, 
                   'data_clob'    VALUE data_clob
                     )) from tablename;

मैंने इस दृष्टिकोण के साथ भी कोशिश की है

2) यदि आप उस संस्करण के साथ पैच / काम करने में असमर्थ हैं, तो लुईस कनिंघम और जोनास क्रॉग्स्बैल द्वारा लिखित एक उत्कृष्ट पैकेज है: पीएल / जेएसओएन * http://pljson.sourceforge.net/

यह एक उत्कृष्ट पैकेज है (मैं इसे कई डेटाबेस प्रतिष्ठानों में उपयोग किया है)

शामिल उदाहरण अच्छे हैं और अधिकतर परिदृश्यों को कवर करते हैं।

declare 
  ret json;
begin
  ret := json_dyn.executeObject('select * from tab');
  ret.print;
end;
/

उल्लेख इस उत्तर में भी है लेकिन इस तरह के बड़े clob के लिए काम नहीं एसक्यूएल क्वेरी के परिणामों को ओरेकल 12 सी में JSON के रूप में लौटाएं

3) अन्य दृष्टिकोण हो सकता है कि हम चयन क्वेरी के बाद स्ट्रिंग को जोड़ सकते हैं।

FOR rec IN (SELECT employee_id, data_clob
                FROM tablename) LOOP
      IF i <> 1 THEN
        v_result := v_result || ',';
      END IF;

      v_result := v_result || '{"employee_id":' || to_char(rec.employee_id) || ',"data_clob": ' || rec.data_clob || '}';

      i := i + 1;
    END LOOP;
    v_result := v_result || ']}'; 

3 दृष्टिकोण मेरी समस्या को हल करता है, लेकिन मैं पाश के लिए चलाना नहीं चाहता । क्या इस को संभालने के लिए ओरेकल में कोई हल है?

मैं समाधान की जांच करता हूं, लेकिन यह बिना किसी लूप के लिए काम करता है।

https://technology.amis.nl/2015/03/13/using-an-aggregation-function-to-query-a-json-string-straight-from-sql/

यूआरएल ने कुछ समाधान प्रदान किया है, मैंने इसे करने की कोशिश की लेकिन काम नहीं कर रहा .समस्या आ रही है

ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 57416, maximum: 4000)

क्या आप मुझे बता सकते हैं कि यह कैसे किया जा सकता है?


इस प्रश्न के जवाब में:

3 दृष्टिकोण मेरी समस्या को हल करता है, लेकिन मैं पाश के लिए चलाना नहीं चाहता । क्या इस को संभालने के लिए ओरेकल में कोई हल है?

ओरेकल की LISTAGG फ़ंक्शन का उपयोग करके स्ट्रिंग को बिना पाशन के लिए LISTAGG जा सकता है:

SELECT '{"employees":[' || LISTAGG('{"employee_id":' || to_char(employee_id)
                      || ',"data_clob":"' || data_clob || '"}', ',')
              WITHIN GROUP (ORDER BY employee_id) || ']}' AS json
FROM tablename;

हालांकि, जैसा कि आपने टिप्पणियों में बताया है, LISTAGG की 4000 वर्णों की सीमा है निम्नलिखित अधिक जटिल / सुधारात्मक है, लेकिन इस सीमा से परे सामना करना चाहिए:

SELECT '{"employees":[' || dbms_xmlgen.convert(
         RTRIM(XMLAGG(XMLELEMENT(E,'{"employee_id":' || to_char(employee_id)
                                 || ',"data_clob":"' || data_clob || '"}',',')
                      .EXTRACT('//text()') ORDER BY employee_id).GetClobVal(),',')
       , 1) || ']}' AS json
FROM tablename;

XMLAGG संभालता है, लेकिन XMLAGG फ़ंक्शन में कुछ वर्णों से बचने का साइड-प्रभाव होता है (जैसे " से &quot; )। ऊपर दिए गए क्वेरी dbms_xmlgen.convert फ़ंक्शन का उपयोग करके इन dbms_xmlgen.convert (जैसे &quot; से " ) को dbms_xmlgen.convert करते हैं - यह उत्तर देखें अधिक जानकारी के लिए।

एसक्यूएल फ़ाइड डेमो: http://sqlfiddle.com/#!4/5b295/40





clob