我正在尝试从json_object_t中将一个非常长的字符串提取到clob中,并使用json_object_t.get_clob(key)方法获得了一些奇怪的数据库行为(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_table查询获取相同的数据,但它根本无法将数据提取到clob列,只允许varchar / number。
这是一个错误还是我做错了什么?有没有其他方法可以从JSON密钥中提取长字符串?
答案 0 :(得分:0)
我与Oracle Database JSON Store小组合作,很乐意帮助您解决您遇到的这个问题。您是否可以尝试使用备用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;
/
期待您的发现..
答案 1 :(得分:0)
这也可以。代替使用get_clob
方法,而使用c
:
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;
答案 2 :(得分:0)
ViewModel