Oracle 12C:使用JSON类型创建BLOB列表时出错

时间:2017-04-25 07:09:24

标签: json oracle constraints oracle12c

在尝试创建一个列为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

2 个答案:

答案 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版