PL/SQL json_值函数为大型json文档提供错误
服务试图从JSON对象提取roleid,但给出PL/SQL json_值函数为大型json文档提供错误,json,oracle,plsql,Json,Oracle,Plsql,服务试图从JSON对象提取roleid,但给出 Error report: ORA-01460: unimplemented or unreasonable conversion requested ORA-06512: at line 1801 01460. 00000 - "unimplemented or unreasonable conversion requested" *Cause: *Action: 代码是 set serveroutput on declare
Error report:
ORA-01460: unimplemented or unreasonable conversion requested
ORA-06512: at line 1801
01460. 00000 - "unimplemented or unreasonable conversion requested"
*Cause:
*Action:
代码是
set serveroutput on
declare
input_data VARCHAR2(32000);
lv_role_id VARCHAR2 (100);
begin
input_data := '';
input_data:=input_data||'{';
input_data:=input_data||' "roleid": "2945",';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "category": [';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "31",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "32",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "33",';
input_data:=input_data||' "ischecked": true';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "34",';
input_data:=input_data||' "ischecked": true';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "35",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "36",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "37",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "38",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "39",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "40",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "41",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "43",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "42",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "44",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "45",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "46",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "47",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "48",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "49",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "50",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "51",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "52",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "53",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "54",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "55",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "56",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "57",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "58",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "59",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "60",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "81",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "314",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "276",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "86",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "72",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "271",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "78",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "383",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "206",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "210",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "384",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "122",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "352",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "307",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "291",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "125",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "236",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "82",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "247",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "234",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "232",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "112",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "66",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "107",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "71",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "73",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "246",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "192",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "273",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "80",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "106",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "195",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "144",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "262",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "118",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "109",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "160",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "272",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "238",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "156",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "178",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "339",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "277",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
// input_data:=much more data
input_data:=input_data||' ]';
input_data:=input_data||'}';
SELECT JSON_VALUE (input_data, '$.roleid' returning number) INTO lv_role_id FROM DUAL;
end;
/
然而,不管其他人怎么想,文档的大小似乎有影响。如果我运行以下更小的JSON解析,它将解析值
set serveroutput on
declare
input_data VARCHAR2(32000);
lv_role_id VARCHAR2 (100);
begin
input_data := '';
input_data:=input_data||'{';
input_data:=input_data||' "roleid": "2945",';
input_data:=input_data||' "featureid": "3"';
input_data:=input_data||'}';
SELECT JSON_VALUE (input_data, '$.roleid' returning number) INTO lv_role_id FROM DUAL;
end;
/
我尝试获取实际的JSON负载,并通过lint验证器运行它,甚至长的验证器也是兼容的。将JSON插入表中的CLOB,然后在列上运行SELECTJSON_值。AskTom的家伙说问题是返回一个大值,但我认为它在获取一个大值时遇到了问题 您的db版本似乎有问题。没有提到,所以我建议升级或寻找补丁。我简化了您的示例,使其具有一个添加到文档的循环,以便于测试。这是db19.3格式,显示json输入数据的长度为31k,并打印预期的消息
$ sql klrice/klrice
SQLcl: Release 19.2 Production on Fri Oct 04 14:48:32 2019
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Fri Oct 04 2019 14:48:34 -04:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> set serveroutput on
SQL>
SQL> declare
input_data VARCHAR2(32000);
lv_role_id VARCHAR2 (100);
begin
input_data := '';
input_data:=input_data||'{';
input_data:=input_data||' "roleid": "2945",';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "category": [';
for i in 1..410 loop
input_data:=input_data||' {';
input_data:=input_data||' "featureid": "3",';
input_data:=input_data||' "id": "'|| i ||'",';
input_data:=input_data||' "ischecked": false';
input_data:=input_data||' },';
end loop;
input_data:=input_data||' ]';
input_data:=input_data||'}';
SELECT JSON_VALUE (input_data, '$.roleid' returning number) INTO lv_role_id FROM DUAL;
dbms_output.put_line('JSON Size:'|| length(input_data));
dbms_output.put_line('Role:'|| lv_role_id);
end;
/
JSON Size:31110
Role:2945
PL/SQL procedure successfully completed.
SQL>
两件事——AskTOM的人每天都要处理这样的问题,所以也许再看看他们的答案,还有,为什么不把输入数据声明为CLOB呢?无需在刚刚在12.2、18和19中测试过的表格中进行选择,即可正常工作。版本12.1-失败。如果我将输入数据切换到CLOB,它会工作@我想你是对的。我从v$版本中选择了*并得到了:Oracle Database 12c Enterprise Edition 12.1.0.2.0-64位生产PL/SQL 12.1.0.2.0-生产“CORE 12.1.0.2.0 Production”TNS for Linux:version 12.1.0.2.0-生产NLSRTL 12.1.0.2.0-生产“@Woodsman cool,所以您有一个硬修复(升级)或一个简单修复(CLOB!)作为一名Oracle DBA,我不知道从我们的版本升级到下一个版本是困难的还是值得的