Oracle 12C:创建JSON类型的BLOB列表时获取错误

Oracle 12C:创建JSON类型的BLOB列表时获取错误,json,oracle,constraints,oracle12c,Json,Oracle,Constraints,Oracle12c,在尝试创建一个表时,将列作为包含JSON值的BLOB数据类型,我将使用一个约束来检查BLOB列是否为JSON。我在Oracle 12C数据库中发现以下错误 CREATE TABLE colorTab ( id NUMBER, color BLOB ) ; ALTER TABLE colorTab ADD CONSTRAINT ensure_json CHECK (color IS JSON STRICT); 错误: 已创建表COLORTAB 从命令中的第7行开始时出错- 更改表格颜色选

在尝试创建一个表时,将列作为包含JSON值的BLOB数据类型,我将使用一个约束来检查BLOB列是否为JSON。我在Oracle 12C数据库中发现以下错误

CREATE TABLE colorTab  (
id NUMBER, 
color BLOB ) ;

ALTER TABLE colorTab 
ADD CONSTRAINT ensure_json CHECK (color IS JSON STRICT);
错误:

已创建表COLORTAB

从命令中的第7行开始时出错- 更改表格颜色选项卡 添加约束确保_json检查颜色为json严格 错误报告- ORA-40499:没有为二进制数据类型定义格式 4049900000-没有为二进制数据类型定义格式 *原因:提供的JSON输入为二进制类型,但格式为 没有定义。 *操作:定义二进制输入的格式

我指的是oracle的以下博客:


JSON支持从12.1.0.2.0开始提供。它在12.1.0.1.0中不可用

也就是说,您的错误似乎不是由于使用12.1.0.1.0运行而导致的

运行12.1.0.1.0我得到

SQL*Plus: Release 12.2.0.1.0 Production on Thu Apr 27 14:16:35 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Last Successful login time: Thu Apr 27 2017 14:16:27 -07:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> CREATE TABLE colorTab  (
  2  id NUMBER,
  3  color BLOB ) ;

Table created.

SQL>
SQL> ALTER TABLE colorTab
  2  ADD CONSTRAINT ensure_json CHECK (color IS JSON STRICT);
ADD CONSTRAINT ensure_json CHECK (color IS JSON STRICT)
                                           *
ERROR at line 2:
ORA-00908: missing NULL keyword


SQL>
和12.1.0.2.0 BP13

C:\Users\Mark D Drake>sqlplus scott/oracle@PDB12102

SQL*Plus: Release 12.2.0.1.0 Production on Thu Apr 27 14:20:17 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.
Last Successful login time: Thu Apr 27 2017 14:18:43 -07:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> CREATE TABLE colorTab  (
  2  id NUMBER,
  3  color BLOB ) ;

Table created.

SQL>
SQL> ALTER TABLE colorTab
  2  ADD CONSTRAINT ensure_json CHECK (color IS JSON STRICT);

Table altered.

SQL>
您的具体环境是什么,包括捆绑补丁等

如果您没有bundle patch 13或更高版本,可以尝试吗

SQL> ALTER TABLE colorTab
  2  ADD CONSTRAINT ensure_json CHECK (color IS JSON  FORMAT JSON STRICT);

Table altered.

SQL>
如果这是可行的,我认为您的版本没有应用强制的JSON补丁。如果是这样的话,我强烈建议更新到最新的数据库捆绑补丁

SQL> CREATE TABLE colorTab (
  2     id NUMBER,
  3     color BLOB
  4  )
  5  /

Table created.

SQL> INSERT INTO colorTab VALUES(1, utl_raw.cast_to_raw (' { "color": "black "dummy"", "rgb": [0,0,0], "hex": "#000000"
} '))
  2  /

1 row created.

SQL> Select json_value(utl_raw.cast_to_varchar2(color) format json,'$.color' ERROR on error)
  2    from colorTab
  3  /
  from colorTab
       *
ERROR at line 2:
ORA-40441: JSON syntax error


SQL>
使用有效的JSON

SQL> DROP TABle COLORTAB
  2  /

Table dropped.

SQL> CREATE TABLE colorTab (
  2     id NUMBER,
  3     color BLOB
  4  )
  5  /

Table created.

SQL> INSERT INTO colorTab VALUES(1, utl_raw.cast_to_raw (' { "color": "black dummy", "rgb": [0,0,0], "hex": "#000000" }
'))
  2  /

1 row created.

SQL> Select json_value(utl_raw.cast_to_varchar2(color) format json,'$.color' ERROR on error)
  2    from colorTab
  3  /

JSON_VALUE(UTL_RAW.CAST_TO_VARCHAR2(COLOR)FORMATJSON,'$.COLOR'ERRORONERROR)
--------------------------------------------------------------------------------
black dummy

SQL>

在运行单元测试时,我在版本12.1.0.2.0中遇到了相同的错误

原因:java.sql.SQLException: ORA-40499:没有为二进制数据类型定义格式

DEFINE _O_VERSION =  "Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options" (CHAR)
DEFINE _O_RELEASE =  "1201000000" (CHAR)
DEFINE _PWD =  "C:\DDrive\Softwares\sqldeveloper-18\sqldeveloper\sqldeveloper\bin" (CHAR)
但同样的方法在版本中也很有效

DEFINE _O_VERSION =  "Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production" (CHAR)
DEFINE _O_RELEASE =  "1202000000" (CHAR)
DEFINE _PWD =  "C:\DDrive\Softwares\sqldeveloper-18\sqldeveloper\sqldeveloper\bin" (CHAR)

尝试使用Oracle DB版本12.2.0.1.0

无法复制hi@Husqvik您是否能够运行上面的alter table命令并能够创建约束?因为我只是在那个步骤中出错。是的,只是复制和粘贴了,创建和更改都进行得很好。@Husqvik我正在下面的oracle db版本中尝试这个。Oracle Database 12c Enterprise Edition 12.1.0.2.0版-64位生产0 PL/SQL 12.1.0.2.0版-生产0 CORE 12.1.0.2.0生产0 TNS Linux版:12.1.0.2.0版-生产0 NLSRTL 12.1.0.2.0版-生产0你的是什么?我只有12.2.0.2.0可用,但你提到的博文是从2015年开始的,所以我很漂亮当然12.1已经支持了。谢谢你的宝贵意见。我将尝试找出我的数据库中应用的修补程序。我尝试这样做实际上是为了找出是否可以使用json_值或其他函数读取特殊字符,而无需在json中提供转义字符并将其存储为Blob列。但是,如果我不将其与转义字符一起存储,它将为我提供null值。另外,我没有在我的blob列中设置任何IS JSON约束,然后存储没有转义字符的特殊字符。如果您想获得显式错误,请在JSON_值中添加ERROR ON ERROR子句。记住JSON_值默认为NULL错误。谢谢,看起来有一些错误,但我如何才能看到错误是什么?创建表colorTab id号,颜色BLOB;插入colorTab值1,utl_raw.cast_to_raw'{color:black dummy,rgb:[0,0,0],hex:000000}';从colorTab中选择json_valueutl_raw.cast_to_varchar2color format json,'$.color'默认值'error';在resultset中检索值作为错误。谢谢。SQL>创建表颜色选项卡2 id号,3色斑点4 5/已创建表。SQL>INSERT INTO colorTab VALUES1,utl_raw.cast_to_raw'{color:black dummy,rgb:[0,0,0],十六进制:000000}'创建了2/1行。SQL>选择json_valueutl_raw.cast_to_varchar2color格式json,'$.color'错误出现在colorTab 3中的错误2/来自colorTab*错误出现在第2行:ORA-40441:json语法错误SQL>