如何使用格式json在Oracle中获取值

时间:2018-12-14 15:32:25

标签: json oracle

我正在尝试获取LineNumber的值,但收到错误消息

  

ORA-31013:无效的XPATH表达式   31013. 00000-“无效的XPATH表达式”   *原因:传递给函数的XPATH表达式无效。   *操作:检查xpath表达式中是否存在语法错误。

格式json 似乎不起作用,Oracle认为 lines.x 是json字符串。

select JSON_value(aaa.af1, '$.a.System.Publisher') 
, lines.x
, JSON_value(lines.x, '$.LineNumber')
from (
    select '{"a":{"System": {"Publisher":"dms_WarehouseExpectedReceipt"},"WarehouseCode":"WHSE1","LineItem":[{"LineNumber":1000,"ItemNumber":"P00001","PackageCode":"*","Lot":"","Gtin":"70000100000015","ExpectedDate":"2018-12-13 12:00:00","InventoryAttributes":{"Character1":"","Character2":"","Character3":""}}]}}' af1 from dual
) aaa

cross apply
  json_table(aaa.af1, '$.a.LineItem[*]' 
  COLUMNS(
     queue_child_seq for ordinality
     , x format json path '$'
  )
) lines

谢谢。

1 个答案:

答案 0 :(得分:1)

有趣。该查询似乎在Oracle 18c中工作得很好,但是当我在本地( Oracle 12c Enterprise Edition版本12.2.0.1.0 )中进行测试时,抛出相同的错误。

LiveSQL Demo

对此我不太确定,但似乎JSON_value期望数据类型为提取的JSON字符串的CLOB,所以错误特别来自JSON_value(lines.x, '$.LineNumber')

我能想到的唯一解决方法是使用lines.xCLOB显式转换为TO_CLOB,这在我的12.2版本中很有效。

JSON_value(TO_CLOB(lines.x), '$.LineNumber')