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
相关产品推荐
相关产品推荐

