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

编译Oracle存储过程报错:期望CURSOR却得CLOB,求CLOB入输出游标方法

问题解决:Oracle存储过程中CLOB放入输出游标报错

错误提示“Inconsistent datatypes: expected CURSOR got CLOB”的根源是你错误地试图将CLOB变量直接SELECT INTO到游标变量中,同时原代码的游标操作逻辑混乱——既打开游标又尝试给游标变量赋值,导致类型不匹配。

修正后的代码方案一(简化逻辑,直接返回GeoJSON)

CREATE OR REPLACE PROCEDURE sp_getPolygon 
(
    CityId IN INT,
    Out_CUR OUT SYS_REFCURSOR
) AS 
BEGIN
    -- 直接在游标查询中生成GeoJSON并返回
    OPEN Out_CUR FOR
        SELECT SDO_UTIL.TO_GEOJSON(GEOMETRY) AS polygon_json
        FROM GISBRANCHES 
        WHERE "FBranchesId" IN (SELECT "Id" FROM "CreBranches" WHERE "FCitiesId" = CityId);
END sp_getPolygon;

修正后的代码方案二(保留中间变量处理逻辑)

如果需要先单独处理几何对象再返回JSON,可以调整为:

CREATE OR REPLACE PROCEDURE sp_getPolygon 
(
    CityId IN INT,
    Out_CUR OUT SYS_REFCURSOR
) AS 
    cola_b_geom SDO_GEOMETRY;
    returned_json CLOB;
BEGIN
    -- 获取目标几何对象(需确保查询返回单行,否则要处理NO_DATA_FOUND/TOO_MANY_ROWS异常)
    SELECT GEOMETRY 
    INTO cola_b_geom
    FROM GISBRANCHES 
    WHERE "FBranchesId" IN (SELECT "Id" FROM "CreBranches" WHERE "FCitiesId" = CityId);
    
    -- 转换为GeoJSON格式
    returned_json := SDO_UTIL.TO_GEOJSON(cola_b_geom);
    
    -- 打开游标,将CLOB作为结果集返回
    OPEN Out_CUR FOR
        SELECT returned_json AS polygon_json FROM DUAL;
END sp_getPolygon;

关键修正点

  • 移除原代码中多余的嵌套BEGIN块,变量声明应放在存储过程的AS之后,而非BEGIN内部。
  • 错误的SELECT returned_json into Out_CUR FROM DUAL;操作被替换为OPEN Out_CUR FOR SELECT ...,这是将数据放入输出游标的正确方式——通过定义游标的查询语句,让游标返回包含CLOB的结果集。
  • 原代码中先打开游标又执行SELECT INTO的操作完全错误,游标一旦打开就不能通过这种方式赋值,且游标变量与CLOB类型本身不兼容,必须通过查询语句将CLOB作为结果列返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:15:34