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

