sql - ORACLE json_object_t - 在方法链获取的对象上调用 get_string() 方法时出错 .get_array() .get()
问题描述
我试图通过 JSON_OBJECT_T 类型的方法链从 JSON 对象中包含的数组中获取一个值 - .get_array(...).get(0).get_string(...)
但得到一个例外component 'GET_STRING' must be declared
这是我的代码,有人可以解释为什么链条不起作用吗?
declare
l_data clob := '{
"data": {
"foo": "bar",
"persons": [{"code":100, "name":"Elon"}, {"code":200, "name":"Musk"}]
}
}';
--
function bool_to_char(val in boolean) return varchar2 is
begin
return case val when true then 'TRUE' else 'FALSE' end;
end;
begin
dbms_output.put_line(
bool_to_char(
json_object_t
.parse(l_data)
.get_object('data')
.get_array('persons')
.get(0)
.is_object
)
); -- TRUE - got object
-- this code works - got "Elon"
dbms_output.put_line(
json_object_t
.parse(
json_object_t
.parse(l_data)
.get_object('data')
.get_array('persons')
.get(0)
.stringify
)
.get_string('name')
);
-- this code does not work - got exception "PLS-00302: component 'GET_STRING' must be declared"
/*
dbms_output.put_line(
json_object_t
.parse(l_data)
.get_object('data')
.get_array('persons')
.get(0)
.get_string('name')
);
*/
end;
解决方案
问题是调用.get(0)
返回类型JSON_ELEMENT_T
,而不是JSON_OBJECT_T
类型。JSON_ELEMENT_T
没有GET_STRING
方法,这就是您收到错误的原因。
使用后get(0)
,可以TREAT
将返回值作为a JSON_OBJECT_T
,以便调用GET_STRING
方法。
请参阅下面的代码
DECLARE
l_data CLOB := '{
"data": {
"foo": "bar",
"persons": [{"code":100, "name":"Elon"}, {"code":200, "name":"Musk"}]
}
}';
--
FUNCTION bool_to_char (val IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
RETURN CASE val WHEN TRUE THEN 'TRUE' ELSE 'FALSE' END;
END;
BEGIN
DBMS_OUTPUT.put_line (
bool_to_char (
json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0).is_object)); -- TRUE - got object
-- this code works - got "Elon"
DBMS_OUTPUT.put_line (
json_object_t.parse (
json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0).stringify).get_string (
'name'));
-- this code does not work - got exception "PLS-00302: component 'GET_STRING' must be declared"
--Fixed using TREAT(... as JSON_OBJECT_T)
DBMS_OUTPUT.put_line (
TREAT (
json_object_t.parse (l_data).get_object ('data').get_array ('persons').get (0)
AS json_object_t).get_string ('name'));
END;
推荐阅读
- reactjs - RaFormInput 宽度似乎总是 256px
- c# - 如何在WEB API中返回数据后添加状态名称:成功和消息?
- wpf - 现代WPFUI + powershell = System.Windows.Markup.StaticResourceHolder
- internationalization - 如何在 SAPUI5 上的 i18n.properties 文件中包含 .properties 文件?
- api - 在 POSTMAN 中保护生产 API 的客户端机密和客户端 ID
- sql - Clickhouse,创建十进制类型的字典
- excel - Excel VBA 宏中的多个运行时错误以在两张工作表之间发送数据
- python - 在 Python 中使用 Pandas 处理对于 Excel 来说太大的数据集
- php - 计算mysql中连续行之间的日期差
- sql - SQL Server 如何执行事务脚本?(同样的问题需要完全不同的时间来执行)