如何使用Oracle 12c搜索BLOB字段中附加的Json文件?

时间:2017-01-05 17:52:23

标签: sql json oracle blob oracle12c

我想在json里面搜索文本。 json持续存在于blob字段中。我创建了下表

CREATE TABLE APPLICATION
  (
    applicationId   VARCHAR2(36),
    customerId      VARCHAR2(36),
    assignee        VARCHAR2(36),
    status          VARCHAR2(36),
    applicationDate TIMESTAMP,
    closerDueDate   TIMESTAMP,
    closedDate      TIMESTAMP,
    application blob ,
    CONSTRAINT application CHECK(application IS JSON FORMAT JSON)) LOB (application) STORE AS(STORAGE (NEXT 15M));

要保留一行我已经使用SQL Develop UI添加所有字段值并将json文件附加到blob字段中。 blob字段中附加的文件有json文本(巨大的json)。

文件示例

{
   "fields" : {
        "Customerid" : "Organization"
   }     
}
//Huge Json

我想使用路径在blob字段内搜索。喜欢:fields.Customerid:"Organization"

我正在使用以下查询,但它没有获得任何行

select * 
from application app 
where dbms_lob.instr(app.application, utl_raw.CAST_TO_RAW('AutomationRuleSet'), 1, 1) > 0;

我知道json持久存在

中存在该值

修改1

如果我尝试:

Select app.application 
From APPLICATION app 
Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet';

我得到了:

Error que empieza en la línea 1 del comando: 
Select app.application From APPLICATION app Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet' 
Error en la línea de comandos:2 Columna:6 Informe de error: 
Error SQL: ORA-40499: no format defined for binary data type

问题是什么?

2 个答案:

答案 0 :(得分:2)

您可以找到JSON BLOBS包含json_exists()的关键路径的行:

select * from application app
where json_exists(app.application, '$.fields.Customerid');

您可以使用json_value()搜索特定值:

select * from application app
where json_value(app.application, '$.fields.Customerid') = 'AutomationRuleSet';

当你正在使用BLOB时,你可能需要指定format json,尽管我没有'似乎需要在12.2和你的表定义中测试它:

select * from application app
where json_exists(application format json, '$.fields.Customerid');

select * from application app
where json_value(application format json, '$.fields.Customerid') = 'AutomationRuleSet';

Oracle Live SQL demo

答案 1 :(得分:0)

快速解决方案: 我找到了解决方案,基本上我必须将BLOB转换为VARCHAR2

select UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( app.application, 4000, 1 )) AS aplication
from application app
Where JSON_VALUE(UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( app.application, 4000, 1 )), '$.fields.Customerid') = 'AutomationRuleSet';

其他解决方案:

使用JSON_TABLE并使用json字段创建表