这个简单的查询工作正常:
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
答案 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版本中,显然有暂时的退步。