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

Oracle 19c游标查询遇ORA-00932数据类型不一致错误求助

ORA-00932错误原因及解决办法

错误根源

你遇到的ORA-00932错误,核心问题是Oracle的普通SQL查询不允许直接返回CURSOR类型作为列值。你的查询是从dual表执行普通SELECT,其中data列是一个嵌套CURSOR,但普通SQL引擎只支持返回标量类型(比如字符串、数字、日期),CURSOR属于行集类型,两者类型不匹配,因此触发报错。

解决思路

有两种常用解决方式,可根据你的使用场景选择:

方式1:用PL/SQL处理游标结果

如果是在PL/SQL环境(比如存储过程、匿名块)中执行,可以声明REF CURSOR变量来接收带嵌套游标的结果,示例如下:

DECLARE
  TYPE DataCursor IS REF CURSOR;
  TYPE MainCursor IS REF CURSOR RETURN (filename VARCHAR2(100), data DataCursor);
  v_main MainCursor;
  v_filename VARCHAR2(100);
  v_data DataCursor;
BEGIN
  OPEN v_main FOR
    SELECT
     'file1' AS "filename",
     cursor(
       SELECT
         a.NOM "nom",
         :P17_DATE_CALCULEE AS "date_devis",
         a.PRENOM AS "prenom",
         a.ADRESSE AS "adresse",
         a.CODE_POSTAL AS "code_postal",
         a.VILLE AS "ville",
         a.TELEPHONE AS "telephone",
         :P17_TOTAL AS "total",
         a.ID AS "numero_devis",
         cursor ( SELECT
                  b.motif AS "motif",
                  b.DESTINATION AS "destination",
                  b.DISTANCE AS "distance",
                  b.PRIX AS "prix"
                  FROM DY_DEVIS_LIGNE b
                  WHERE B.ID_DEVIS = :P17_NUMERO) 
       FROM DY_DEVIS a
       WHERE a.ID = :P17_NUMERO
     ) AS "data"
    FROM dual;
  -- 后续可遍历游标处理数据
  FETCH v_main INTO v_filename, v_data;
  -- 处理v_data游标逻辑...
  CLOSE v_main;
END;
/

方式2:将游标结果转为JSON/XML格式

如果需要在普通SQL中返回结构化结果,可以把嵌套游标转换成JSON(或XML)字符串,让列类型变为字符串,符合普通SQL的要求。针对你的代码,修改为JSON格式的示例:

SELECT
 'file1' AS "filename",
 JSON_OBJECT(
   'nom' VALUE a.NOM,
   'date_devis' VALUE :P17_DATE_CALCULEE,
   'prenom' VALUE a.PRENOM,
   'adresse' VALUE a.ADRESSE,
   'code_postal' VALUE a.CODE_POSTAL,
   'ville' VALUE a.VILLE,
   'telephone' VALUE a.TELEPHONE,
   'total' VALUE :P17_TOTAL,
   'numero_devis' VALUE a.ID,
   'details' VALUE (
     SELECT JSON_ARRAYAGG(
              JSON_OBJECT(
                'motif' VALUE b.motif,
                'destination' VALUE b.DESTINATION,
                'distance' VALUE b.DISTANCE,
                'prix' VALUE b.PRIX
              )
            )
     FROM DY_DEVIS_LIGNE b
     WHERE B.ID_DEVIS = :P17_NUMERO
   )
 ) AS "data"
FROM DY_DEVIS a
WHERE a.ID = :P17_NUMERO

该查询会把原本的嵌套游标结构转换成JSON对象,data列变为JSON字符串,不会再出现类型不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:23:17