sql - كيفية إنشاء جسون في أوراكل ل كلوب التي هي>32K(على سبيل المثال 60،000 حرفا)؟




json oracle plsql clob (2)

وردا على هذا السؤال:

3 نهج حل مشكلتي ولكن أنا لا أريد أن تشغيل حلقة . هل هناك أي حل في أوراكل للتعامل مع هذا.

يمكن أن تكون سلاسل متسلسلة دون حلقات باستخدام وظيفة 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 يعالج CLOB s ولكن الدالة CLOB لها تأثير جانبي للهروب من بعض الأحرف (على سبيل المثال من " إلى " ) الاستعلام أعلاه يحول هذه العودة (على سبيل المثال من " dbms_xmlgen.convert " إلى " ) باستخدام الدالة dbms_xmlgen.convert - انظر هذه الإجابة لمزيد من التفاصيل.

سكل فيدل التجريبي: http://sqlfiddle.com/#!4/5b295/40

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;
/

أذكر في هذه الإجابة أيضا ولكن لا يعمل لمثل هذا كبير كلوب. عودة نتائج الاستعلام سكل كما جسون في أوراكل 12C

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/

ورل لديها بعض الحلول، حاولت هذا ولكن لا يعمل .Same المسألة قادم.

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

هل يمكن أن تخبرني كيف يمكن القيام به؟


JSON.parse("your string");

هذا كل شئ.







sql json oracle plsql clob