【发布时间】:2017-11-03 09:54:17
【问题描述】:
1) 我必须从 oracle 选择查询中生成 json,我可以遵循三种方法。
SELECT JSON_ARRAY(json_object('id' VALUE employee_id,
'data_clob' VALUE data_clob
)) from tablename;
我也尝试过这种方法
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;
/
在这个答案中也提到但不适用于这么大的笨蛋。 Return results of a sql query as JSON in oracle 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 种方法解决了我的问题,但我不想运行 for 循环。 oracle有什么解决方案来解决这个问题吗?
我检查了解决方案,但没有 for 循环就无法工作。
url 提供了一些解决方案,我试过了,但没有用。同样的问题来了。
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 57416, maximum: 4000)
你能告诉我怎么做吗?
【问题讨论】:
-
这种情况下数据库的版本是多少? Oracle 12c (12.1.0.2) 具有本机 json 数据类型,它可能会解决您的问题 (docs.oracle.com/database/121/ADXDB/json.htm)。还有一个 DB 参数 MAX_STRING_SIZE 可以设置为 EXTENDED(为您提供 32k 的 VARCHAR2 变量)。为什么所有这些信息用于:在 Oracle 数据库中,JSON 数据使用常见的 SQL 数据类型 VARCHAR2、CLOB 和 BLOB 进行存储(请查看:docs.oracle.com/database/122/ADJSN/…)。
-
您遇到的错误表明参数 MAX_STRING_SIZE 设置为 STANDARD,并且您正在尝试将 CLOB (4GB) 转换为 VARCHAR2 (即 4000b)。如果您需要 60k 之类的数据,则不能使用 VARCHAR2,而只能使用 CLOB,也就是说,如果您希望将全部数据放在一个变量中。
-
JSON_ARRAY 和 JSON_OBJECT 毫无价值,因为它们会阻塞超过 4000 个字符的字符串。我到底应该如何控制它??
标签: sql json oracle plsql clob