暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 从odata获取JSON到json表,特殊字符为 “@”

askTom 2018-08-23
733

问题描述

你好,汤姆,
f/e创建的odata-JSON字符串https://www.odata.org/getting-started/通过web服务提供的内容需要插入到表中。
json看起来像:
{"@ odata.context": "serviceRoot/$ 元数据 # 人"}
如何从JSON字符串中提取上下文。
另请参阅实时链接,但这是pl/sql块

declare 
  a_str varchar2(4000);
cursor c_cur (p_str IN VARCHAR2) is
 select JS.* from 
        json_table(p_str FORMAT JSON ,  '$'
         COLUMNS ( c_context varchar2(100) PATH '$.@odata.context',
                   c_nextDelta varchar2(100) PATH '$.@odata.nextDelta'
                  ) ) AS "JS";  
begin 
  a_str:= '{"@odata.context": "odatacontext", ' 
        ||' "@odata.nextDelta": "odatanextDelta"' 
        ||'} ' ;
   for r_cur in c_cur(a_str) loop
     dbms_output.put_line (r_cur.c_context||'; '|| 
                           r_cur.c_nextDelta||';'
                           );
   end loop;
 end;
/

专家解答

JSON解析器将路径中的点解释为嵌套属性。因此,您需要在路径表达式中以双引号包装整个属性名称。

但是在查询JSON属性 (包括12.1中的特殊字符) 时有一个错误。所以它仍然失败:

select js.* 
from   json_table('{
  "@odata.context": "odatacontext",
  "@odata.nextDelta": "odatanextDelta"
}' format json , '$'
         columns ( 
           c_context varchar2(100) path '$."@odata.context"',
           c_nextdelta varchar2(100) path '$."@odata.nextDelta"'
         ) 
) as js;

ORA-40442: JSON path expression syntax error


幸运的是,这是固定在12.2:

select * from v$version;

BANNER                                                                         CON_ID   
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production          0 
PL/SQL Release 12.2.0.1.0 - Production                                                0 
CORE 12.2.0.1.0 Production                                                            0 
TNS for Linux: Version 12.2.0.1.0 - Production                                        0 
NLSRTL Version 12.2.0.1.0 - Production                                                0

select js.* 
from   json_table('{
  "@odata.context": "odatacontext",
  "@odata.nextDelta": "odatanextDelta"
}' format json , '$'
         columns ( 
           c_context varchar2(100) path '$."@odata.context"',
           c_nextdelta varchar2(100) path '$."@odata.nextDelta"'
         ) 
) as js;

C_CONTEXT      C_NEXTDELTA      
odatacontext   odatanextDelta   


believe这是由错误18999568引起的。有关补丁的详细信息,请参阅MOS注释2123923.1和1992767.1。

PS-感谢您使用LiveSQL。但是您需要保存脚本并共享此链接!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论