我在Oracle Xe 11g中安装了pljson 1.05,并编写了一个PLSQL函数,从Amazon描述实例的返回中提取值。
尝试获取顶级项的值,如保留ID工作,但我无法获得嵌套在json较低级别中的值。
例如,这个示例工作正常(使用内联的剪裁AWS JSON
DECLARE
reservations JSON_LIST;
l_tempobj JSON;
instance JSON;
L_id VARCHAR2(20);
BEGIN
obj:= json('{
"Reservations": [
{
"ReservationId": "r-5a33ea1a",
"Instances": [
{
"State": {
"Name": "stopped"
},
"InstanceId": "i-7e02503e"
}
]
},
{
"ReservationId": "r-e5930ea5",
"Instances": [
{
"State": {
"Name": "running"
},
"InstanceId": "i-77859692"
}
]
}
]
}');
reservations := json_list(obj.get('Reservations'));
l_tempobj := json(reservations);
DBMS_OUTPUT.PUT_LINE('============');
FOR i IN 1 .. l_tempobj.count
LOOP
DBMS_OUTPUT.PUT_LINE('------------');
instance := json(l_tempobj.get(i));
instance.print;
l_id := json_ext.get_string(instance, 'ReservationId');
DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id);
END LOOP;
END;返回
============
------------
{
"ReservationId" : "r-5a33ea1a",
"Instances" : [{
"State" : {
"Name" : "stopped"
},
"InstanceId" : "i-7e02503e"
}]
}
1] Instance:r-5a33ea1a
------------
{
"ReservationId" : "r-e5930ea5",
"Instances" : [{
"State" : {
"Name" : "running"
},
"InstanceId" : "i-77859692"
}]
}
2] Instance:r-e5930ea5但是这个返回实例ID的示例没有
DECLARE
l_clob CLOB;
obj JSON;
reservations JSON_LIST;
l_tempobj JSON;
instance JSON;
L_id VARCHAR2(20);
BEGIN
obj:= json('{
"Reservations": [
{
"ReservationId": "r-5a33ea1a",
"Instances": [
{
"State": {
"Name": "stopped"
},
"InstanceId": "i-7e02503e"
}
]
},
{
"ReservationId": "r-e5930ea5",
"Instances": [
{
"State": {
"Name": "running"
},
"InstanceId": "i-77859692"
}
]
}
]
}');
reservations := json_list(obj.get('Reservations'));
l_tempobj := json(reservations);
DBMS_OUTPUT.PUT_LINE('============');
FOR i IN 1 .. l_tempobj.count
LOOP
DBMS_OUTPUT.PUT_LINE('------------');
instance := json(l_tempobj.get(i));
instance.print;
l_id := json_ext.get_string(instance, 'Instances.InstanceId');
DBMS_OUTPUT.PUT_LINE(i||'] Instance:'||l_id);
END LOOP;
END;返回
============
------------
{
"ReservationId" : "r-5a33ea1a",
"Instances" : [{
"State" : {
"Name" : "stopped"
},
"InstanceId" : "i-7e02503e"
}]
}
1] Instance:
------------
{
"ReservationId" : "r-e5930ea5",
"Instances" : [{
"State" : {
"Name" : "running"
},
"InstanceId" : "i-77859692"
}]
}
2] Instance:从第一个示例到第二个示例的唯一更改是将'ReservationId‘替换为'Instances.InstanceId’,但是在第二个示例中,尽管函数成功,并且instance.print语句输出完整的json,但这段代码没有将实例ID填充到l_id中,因此不会在DBMS_OUTPUT上输出。
如果我只使用'InstanceId‘,也会得到相同的结果(即在L_id中没有值)。
我的假设和从阅读示例中可以看出,JSON路径应该允许我使用嵌套值的点表示法来选择值,但它似乎不起作用。如果输入JSON_LIST,我还尝试将“实例”提取到临时变量中,然后从那里访问它,但也无法获得一个工作示例。
任何帮助都很感激。非常感谢。
发布于 2014-12-31 00:49:49
见ex8.sql。它特别指出:
用于PL/ JSON的JSON路径:
因此,你的道路应该是:
l_id := json_ext.get_string(instance, 'Instances[1].InstanceId');或者,不直接使用json_ext
l_id := instance.path('Instances[1].InstanceId');https://stackoverflow.com/questions/27708880
复制相似问题