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