如何在PL/SQL存储过程中返回SYS REFCURSOR给前端

小宇君_7699

小宇君_7699

2026-11-08

185人浏览

原创

Oracle存储过程必须通过OUT SYS_REFCURSOR传递游标句柄,调用方自行FETCH;OPEN必须在BEGIN块内,不可在声明区;禁止过程内FETCH/CLOSE;多分支须确保每个路径都OPEN同一参数;弱类型易致运行时类型错误,建议强类型游标提升稳定性。

如何在pl/sql存储过程中返回sys refcursor给前端

Oracle 存储过程不能直接把结果集“吐”给前端,必须通过 SYS_REFCURSOR 作为 OUT 参数传递游标句柄——前端(或中间层)拿到这个句柄后,自己去 fetch 数据。这是 Oracle 的设计约束,不是写法问题。

存储过程中声明和打开 SYS_REFCURSOR 的正确姿势

必须用 OUT SYS_REFCURSOR 声明参数,不能是 IN 或 IN OUT;OPEN ... FOR 必须写在 BEGIN 块里,不能放在声明区。

  • OPEN p_result FOR SELECT * FROM emp WHERE deptno = p_dept_id; 支持绑定变量、子查询、动态 SQL(用 EXECUTE IMMEDIATE)
  • 不要在过程里对 p_result 做 FETCH 或 CLOSE——它只是个指针,生命周期交给调用方
  • 如果过程有多个分支,每个分支都必须 OPEN 同一个 OUT 参数,否则调用方可能拿到未初始化的游标,报 ORA-01001: invalid cursor

PL/SQL 匿名块调用时怎么接收并遍历

在 SQL*Plus / SQL Developer 里测试,必须用冒号前缀声明绑定变量::cur_out,且需提前执行 SET SERVEROUTPUT ON 才能看到输出。

HISUI 前端框架开发指南(IRIS版)
HISUI 前端框架开发指南(IRIS版)

HISUI 前端框架基础开发指南。HISUI 是基于 easyui 二次开发的 jQuery UI 组件库,专为医疗信息系统设计。当涉及 HISUI 组件开发、jQuery easyui 表格/表单/布局/窗口、医疗系统前端页面编写时使用此 skill。 涵盖 40 个组件的官方文档参考,支持声明式与编程式两种初始化方式,提供 $cm/$m 数据访问方法。

下载
  • 声明变量要匹配类型:cur_var SYS_REFCURSOR;
  • 不能直接 FOR rec IN cur_var LOOP —— 这语法只适用于显式游标,SYS_REFCURSOR 必须先 FETCH INTO 一个已定义结构的变量(如 emp%ROWTYPE)或使用 DBMS_SQL 动态处理
  • 务必在循环结束后 CLOSE cur_var;,否则下次调用可能触发 ORA-01000: maximum open cursors exceeded

Java/JDBC 调用时 registerOutParameter 的关键点

MyBatis 或原生 JDBC 都必须显式注册游标类型,否则 getResultSet() 会返回 null 或抛 ORA-17004。

  • JDBC 层:用 registerOutParameter(1, OracleTypes.CURSOR),不是 Types.OTHER
  • MyBatis Mapper XML 中,statementType="CALLABLE" + jdbcType="CURSOR" 缺一不可;resultType="map" 只能用于自动映射列名,但无法保证字段顺序稳定
  • 别依赖 MyBatis 自动关闭游标——应用层拿到 ResultSet 后,必须手动 rs.close(),否则连接池里的物理游标不会释放

容易被忽略的弱类型陷阱

SYS_REFCURSOR 不校验列结构,编译期完全放行。同一个过程,不同参数可能打开结构完全不同的查询,但调用方仍用同一套 FETCH INTO 逻辑,就会在运行时报 PLS-00382: expression is of wrong type 或 ORA-06502。

  • 前端或 Java 层不能假设列顺序固定——要用列名取值(rs.getString("EMP_NAME")),而不是下标(rs.getString(1))
  • 如果过程可能返回多种结果集,建议在包头统一定义强类型游标(TYPE t_cur IS REF CURSOR RETURN emp%ROWTYPE),牺牲一点灵活性换掉运行时崩溃风险
  • 所有异常路径(比如 EXCEPTION 块)里,如果游标已打开,必须 CLOSE,否则泄漏不可逆

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

前端 存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2883

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6303

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7210

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

7058

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

1003

5

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4843

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

991

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1269

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6861

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程