在尝试创建一个列为BLOB数据类型保存JSON值的表时,我正在设置一个约束来检查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行开始出错 - ALTER TABLE colorTab 添加CONSTRAINT ensure_json CHECK(颜色是JSON STRICT) 错误报告 - ORA-40499:没有为二进制数据类型定义的格式 40499. 00000 - “没有为二进制数据类型定义格式” *原因:提供的JSON输入是二进制类型,但格式为 没有定义的。 *操作:定义二进制输入的格式。
我指的是oracle中的以下博客:
https://blogs.oracle.com/jsondb/entry/storing_json_in_blob_columns
答案 0 :(得分:1)
从12.1.0.2.0开始提供JSON支持。它在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>
您的确切环境是什么(包括捆绑补丁等...)
如果您没有捆绑补丁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>
答案 1 :(得分:0)
在运行单元测试时,我在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版