Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JSON提取很长的字符串到CLOB_Json_String_Oracle_Plsql - Fatal编程技术网

从JSON提取很长的字符串到CLOB

从JSON提取很长的字符串到CLOB,json,string,oracle,plsql,Json,String,Oracle,Plsql,我试图从json_object_t中提取一个很长的字符串到clob中,并使用json_object_t.get_clobkey方法获得了一些奇怪的数据库行为12.2c。 下面是一个示例代码: DECLARE l_data CLOB := '{"text": "very long string about 1M chars"}'; l_json json_object_t; l_text CLOB := EMPTY_CLOB(); BEGIN l_json := json_obje

我试图从json_object_t中提取一个很长的字符串到clob中,并使用json_object_t.get_clobkey方法获得了一些奇怪的数据库行为12.2c。 下面是一个示例代码:

DECLARE
  l_data CLOB := '{"text": "very long string about 1M chars"}';
  l_json json_object_t;
  l_text CLOB := EMPTY_CLOB();
BEGIN
  l_json := json_object_t.parse(l_data);
  l_text := l_json.get_clob('text');
  dbms_output.put_line('got ' || dbms_lob.getlength(l_text) || ' chars');
END;
当“text”键中的字符串长度小于32k个字符时,get_clob方法工作正常并显示适当的结果,但对于较长的字符串,它会生成长度为零的空clob,就像get_string一样,但没有“字符串缓冲区太小”异常

我试图通过json_表查询获得相同的数据,但它根本无法将数据提取到clob列,只允许使用varchar/number


这是一个错误还是我做错了什么?还有其他方法可以从JSON键中提取长字符串吗?

我与Oracle数据库JSON存储组合作,很乐意为您解决这个问题。您是否可以尝试替代此函数的另一个get_Clob过程,并告诉我们行为是什么

签名:

MEMBER PROCEDURE get_Clob(key VARCHAR2, c IN OUT CLOB)
请试试这个:

DECLARE
    content_json CLOB := '{"value":"';
    content_json_end CLOB := '"}';
    content_tmp CLOB := 'ab';
    l_json json_object_t;
     l_text CLOB := EMPTY_CLOB();
    tmp clob;
BEGIN
    -- 13 gives 16K
    -- 14 gives 32K
    FOR count IN 1 .. 14
    loop
        dbms_lob.append(content_tmp, content_tmp);  -- a bad append for now
    END loop;

    dbms_lob.append(content_json, content_tmp);
    dbms_lob.append(content_json, content_json_end);

    l_json := json_object_t.parse(content_json);
    l_json.get_clob('value', l_text); -- !!! TRY THIS PROC get_Clob
    --l_text := l_json.get_clob('value');

    dbms_output.put_line('Lob size in Kb: ');
    dbms_output.put_line(dbms_lob.getLength(l_text) / 1024);
END;
/ 

期待你的发现

这同样有效。使用c代替get_clob方法:


嗨,我只是想和你核实一下。。你试过另一种方法吗?这有用吗?唉,同样的结果:Lob大小(Kb):0。此外,get_blob工作正常-Caine,我是开发JSON_OBJECT_T等方法的人。不幸的是,我无法复制您的问题,并尝试了几个早期版本。请向我提供以下信息:1您正在使用哪个数据库字符集从sys.props$中选择值$,其中name='NLS_CHARACTERSET';2您使用的数据库版本是什么?从V$INSTANCE中选择版本;现在在12.2.0.1数据库版本上使用ALF32UTF8字符集进行复制。同时我们已经解决了这个问题。请与Oracle支持部门联系,获取数据库版本的后端口。谢谢。如果您想提取一个长键值:json\u elem json\u ELEMENT\T;json_elem:=json_obj.get'data';DBMS_OUTPUT.PUT_LINEjson_elem.to_clob;只要执行,你就会发现你的梦想json:D
DECLARE

   CURSOR crsrJSON IS
   SELECT 
       json_object( 'employee_id'     VALUE employee_id,
                    'first_name'      VALUE first_name,
                    'last_name'       VALUE last_name,
                    'email'           VALUE email,
                    'phone_number'    VALUE phone_number,
                    'hire_date'       VALUE to_char(hire_date,'MM/DD/YYYY'),
                    'job_id'          VALUE job_id,
                    'salary'          VALUE nvl(salary,0),
                    'commission_pct'  VALUE nvl(commission_pct,0),
                    'manager_id'      VALUE NVL(manager_id,0),
                    'department_id'   VALUE NVL(department_id,0), 
                    'department_name' VALUE (select department_name from departments x where x.department_id = hr.department_id), 
                    'job_title'       VALUE (select job_title from jobs x where x.job_id = hr.job_id)) emp_data
    FROM 
           employees hr;

    js_array JSON_ARRAY_T := new JSON_ARRAY_T;

    json_obj  JSON_OBJECT_T := JSON_OBJECT_T();

    json_clob CLOB := EMPTY_CLOB();

BEGIN

   FOR data_rec IN crsrJSON LOOP

     js_array.append(JSON_ELEMENT_T.parse(data_rec.emp_data));

   END LOOP;

   json_obj.put('data',js_array);



   IF json_obj.has('data') THEN

      json_clob := json_obj.to_clob;
      DBMS_OUTPUT.PUT_LINE(json_clob);


   ELSE

     DBMS_OUTPUT.PUT_LINE('Nope');

   END IF;

END;
with data as
  ( select 
    xmlelement(e,regexp_replace('{"name":"'||colname||'"}', '[[:cntrl:]]', ''),',') col1
    from tblname
  )
  select
        rtrim(replace(replace(replace(xmlagg(col1).getclobval(),'&'||'quot;','"'),'<E>',''),'</E>',''),',')
        as very_long_json
  from data;