Him*_*rma 12 sql oracle json plsql clob
1)我必须从oracle select query中创建json,它有三种方法我可以遵循.
SELECT JSON_ARRAY(json_object('id' VALUE employee_id,
'data_clob' VALUE data_clob
)) from tablename;
Run Code Online (Sandbox Code Playgroud)
我也试过这种方法
2)如果您无法修补/使用该版本,那么Lewis Cunningham和Jonas Krogsboell撰写的优秀软件包:PL/JSON*http://pljson.sourceforge.net/
这是一个很好的包(我在很多数据库安装中都使用它).
包含的示例很好,涵盖了大多数情况.
declare
ret json;
begin
ret := json_dyn.executeObject('select * from tab');
ret.print;
end;
/
Run Code Online (Sandbox Code Playgroud)
提及在这个答案中也是如此,但不适用于这样的大事. 在oracle 12c中将sql查询的结果作为JSON返回
3)另一种方法是我们可以在select查询之后连接字符串.
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 || ']}';
Run Code Online (Sandbox Code Playgroud)
3方法解决了我的问题,但我不想运行循环.oracle中是否有任何解决方案可以解决这个问题.
我检查解决方案,但没有for循环不起作用.
url已经提供了一些解决方案,我试过这个但是没有工作.同样的问题即将来临.
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 57416, maximum: 4000)
你能告诉我怎么做吗?
在回答这个问题时:
3方法解决了我的问题,但我不想运行循环.oracle中是否有任何解决方案可以解决这个问题.
通过使用Oracle的LISTAGG
函数,可以在不循环的情况下连接字符串:
SELECT '{"employees":[' || LISTAGG('{"employee_id":' || to_char(employee_id)
|| ',"data_clob":"' || data_clob || '"}', ',')
WITHIN GROUP (ORDER BY employee_id) || ']}' AS json
FROM tablename;
Run Code Online (Sandbox Code Playgroud)
但是,正如您在评论中指出的那样,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;
Run Code Online (Sandbox Code Playgroud)
XMLAGG
处理CLOB
秒,但所述EXTRACT
功能具有:(来自例如逸出某些字符的副作用"
到"
).上述查询将这些回(例如,从"
到"
使用)dbms_xmlgen.convert
功能-看到这个答案对于进一步的细节.
SQL小提琴演示: http ://sqlfiddle.com/#!4/5b295/40
归档时间: |
|
查看次数: |
5649 次 |
最近记录: |