Oracle 12C:创建JSON类型的BLOB列表时获取错误
在尝试创建一个表时,将列作为包含JSON值的BLOB数据类型,我将使用一个约束来检查BLOB列是否为JSON。我在Oracle 12C数据库中发现以下错误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行开始时出错- 更改表格颜色选
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>