Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过使用检查约束将JSON列限制为特定对象_Json_Oracle_Oracle12c - Fatal编程技术网

通过使用检查约束将JSON列限制为特定对象

通过使用检查约束将JSON列限制为特定对象,json,oracle,oracle12c,Json,Oracle,Oracle12c,我们使用的是Oracle 12.2,表结构如下: create table myData ( id number, json_data varchar2(4000), CONSTRAINT checkJson CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS), CONSTRAINT checkJson_F1 CHECK (json_exists(json_data, '$.FIELD1')), CON

我们使用的是Oracle 12.2,表结构如下:

create table myData
(
    id number,
    json_data varchar2(4000),
    CONSTRAINT checkJson    CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
    CONSTRAINT checkJson_F1 CHECK (json_exists(json_data, '$.FIELD1')),
    CONSTRAINT checkJson_F2 CHECK (json_exists(json_data, '$.FIELD2'))
);
我们使用约束(checkJson_F1、checkJson_F2)确保只有在字段1和字段2存在时才能进行插入/更新:

insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def"}'); -- OK
insert into myData(id, json_data) values(2, '{"FIELD1" : "abc"}'); -- Error
是否有方法检查不存在的对象,例如,我想限制以下插入生成错误:

insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def", "FIELD3" : "def"}');
换句话说:我需要一个检查约束,在这里我可以限制可以存储在JSON列中的对象。我的伪代码如下所示:

CONSTRAINT checkJson_FX CHECK (json_getObjects(json_data, '$.*') in ("FIELD1", "FIELD2"))

感谢您的回答,看起来.size()函数只适用于更高版本(例如19c)。在12.2中,当我调用这个函数时,我得到null:从dual中选择json_值('{“FIELD1”:“abc”,“FIELD2”:“def”}','$.size()');
create table myData (
  id number,
  json_data varchar2(4000),
  CONSTRAINT checkJson    CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
  CONSTRAINT checkJson_F1 CHECK (
    json_exists(json_data, '$?(@.size() == 2 && exists(@.FIELD1) && exists(@.FIELD2))')
  )
);