You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中查询Struct类型列报错ORA-00904的解决方法求助

解决Oracle中查询STRUCT/JSON类型列字段的问题

错误原因

你遇到的ORA-00904错误,是因为Oracle不支持像其他SQL环境那样直接用person.firstName的语法访问STRUCT对象或JSON字段的属性,需要使用Oracle特有的语法来解析。


针对不同列类型的解决方案

情况1:person是Oracle自定义OBJECT类型(STRUCT)

如果person列基于自定义的OBJECT类型创建(比如预先定义了包含firstName、lastName、age属性的对象类型),可以通过以下方式访问属性:

方式1:直接使用对象属性访问符(需确保属性名大小写匹配)

Oracle默认会将标识符转为大写,若创建对象类型时未用双引号指定小写属性名,直接用大写属性名访问:

SELECT
  id,
  person.FIRSTNAME AS firstname,
  person.LASTNAME AS lastname,
  person.AGE AS age
FROM your_table;

如果创建对象类型时用双引号定义了小写属性名(如"firstName"),查询时必须带双引号:

SELECT
  id,
  person."firstName" AS firstname,
  person."lastName" AS lastname,
  person."age" AS age
FROM your_table;

方式2:使用VALUE()函数引用对象实例

SELECT
  id,
  VALUE(person).firstName AS firstname,
  VALUE(person).lastName AS lastname,
  VALUE(person).age AS age
FROM your_table;

情况2:person是JSON格式字符串(VARCHAR2/CLOB/JSON类型)

如果person列实际存储的是JSON格式的字符串(比如用VARCHAR2或CLOB类型存储,或是Oracle 12c+的JSON类型),需要用Oracle的JSON解析函数提取字段:

方式1:JSON_VALUE函数(适合提取单个字段)

SELECT
  id,
  JSON_VALUE(person, '$.firstName') AS firstname,
  JSON_VALUE(person, '$.lastName') AS lastname,
  JSON_VALUE(person, '$.age') AS age
FROM your_table;

方式2:JSON_TABLE函数(适合批量解析多字段或复杂JSON)

SELECT
  t.id,
  j.firstname,
  j.lastname,
  j.age
FROM your_table t,
     JSON_TABLE(t.person, '$'
       COLUMNS(
         firstname VARCHAR2(50) PATH '$.firstName',
         lastname VARCHAR2(50) PATH '$.lastName',
         age VARCHAR2(3) PATH '$.age'
       )
     ) j;

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:36:15