【问题标题】:Oracle 12C: Error getting while create BLOB column table with JSON typeOracle 12C:使用 JSON 类型创建 BLOB 列表时出错
【发布时间】:2017-09-22 01:38:43
【问题描述】:

在尝试创建一个列作为 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 颜色选项卡 添加约束 ensure_json 检查(颜色是 JSON STRICT) 错误报告 - ORA-40499: 没有为二进制数据类型定义格式 40499. 00000 - “没有为二进制数据类型定义格式” *原因:提供的 JSON 输入是二进制类型,但格式是 没有定义的。 *操作:定义二进制输入的格式。

我指的是oracle中的以下博客:

https://blogs.oracle.com/jsondb/entry/storing_json_in_blob_columns

【问题讨论】:

  • 无法复制
  • 嗨@Husqvik 您是否能够运行上面的alter table 命令并能够创建约束?因为我只在该步骤中遇到错误。
  • 是的,刚刚复制和粘贴,CREATE 和 ALTER 都很好。
  • @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 for Linux:版本 12.1.0.2.0 - 生产 0 NLSRTL 版本12.1.0.2.0 - 生产 0 你的是什么?
  • 我只有 12.2.0.2.0 可用,但你提到的博客文章是从 2015 年开始的,所以我很确定它已经在 12.1 上得到支持。

标签: json oracle constraints oracle12c


【解决方案1】:

我在运行单元测试时在版本 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

【讨论】:

    【解决方案2】:

    从 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>
    

    【讨论】:

    • 感谢您的宝贵意见。我将尝试找出在我的数据库中应用的补丁。我实际上正在尝试这个来确定是否可以使用 json_value 或其他函数读取特殊字符,而无需在 json 中提供转义字符并将其存储为 Blob 列。但是我看看如果我不将它与转义字符一起存储,它会给我空值。 PS。我没有在我的 blob 列中放置任何 IS JSON 约束,然后存储了没有转义字符的特殊字符。
    • 如果您想获得明确的错误,请将 ERROR ON ERROR 子句添加到 JSON_VALUE。记住 JSON_VALUE 默认为 NULL ON ERROR。
    • 谢谢,看起来有一些错误,但我怎么才能看到错误是什么? CREATE TABLE colorTab (id NUMBER, color BLOB); INSERT INTO colorTab VALUES(1, utl_raw.cast_to_raw (' { "color": "black "dummy"", "rgb": [0,0,0], "hex": "#000000" } '));从 colorTab 中选择 json_value(utl_raw.cast_to_varchar2(color) format json,'$.color' DEFAULT 'error' on error);在结果集中检索值作为“错误”。谢谢。
    • SQL> CREATE TABLE colorTab (2 id NUMBER, 3 color BLOB 4) 5 / 表已创建。 SQL> INSERT INTO colorTab VALUES(1, utl_raw.cast_to_raw (' { "color": "black "dummy"", "rgb": [0,0,0], "hex": "#000000" } ')) 2 / 1 行已创建。 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>
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多