存储过程中的Oracle IS JSON

时间:2018-12-17 07:04:23

标签: json oracle plsql

这个简单的查询工作正常:

SELECT CASE WHEN SBM_MESSAGE_BODY IS JSON THEN 1 ELSE 0 END AS IS_JSON,  
       JSON_VALUE(SBM_MESSAGE_BODY, '$.CRMId') AS CRMId
  FROM SBM_SERVICEBUS_MESSAGE 
 WHERE SBM_ID=1;

结果是:

IS_JSON,CRMID
1,      CRM000001

现在,我将相同的查询放入存储过程中:

CREATE OR REPLACE PROCEDURE USP_SB_TEST 
AS
    ls varchar2(4000);
    ls2 varchar2(4000);

BEGIN

    SELECT CASE WHEN SBM_MESSAGE_BODY IS JSON THEN 1 ELSE 0 END AS IS_JSON,  
           JSON_VALUE(SBM_MESSAGE_BODY, '$.CRMId') AS CRMId
      INTO ls,ls2
      FROM SBM_SERVICEBUS_MESSAGE 
     WHERE SBM_ID=1;

    dbms_output.put_line( 'IS JSON=' || ls );
    dbms_output.put_line( 'CRMId=' || ls2 );

END ;    

我在包含“ IS JSON”的行上收到此编译错误:

  

[错误]语法检查(8:42):错误第8行,第42行,结束行8,   Ending_col 45,找到“ JSON”,期望:空荡荡的无尽   NAN空值-或-当前不存在

我正在使用TOAD

1 个答案:

答案 0 :(得分:2)

在12.2版中集成到PL / SQL中的JSON运算符(请参见Oracle Database 12c Release 2 (12.2) New Features

  

JSON改进

     
      
  • PL / SQL支持JSON运算符。
  •   
  • 支持使用PL / SQL处理JSON文档。这包括对JSON文档进行增量修改的功能。
  •   

因此您的Oracle版本太旧了,无法支持它。

在Oracle 11g之前,PL / SQL通常仅支持SQL的子集。然后,Oracle对其进行了改进并将其提高到标准水平。在12.1版本中,显然有暂时的退步。