oracle 存储过程返回表数据
2015-11-23 12:33
477 查看
近在测试程序需要调存储过程,项目主要针对oracle数据库,在测试过程中发现一些“坑”,这里记录下:
在百度搜索结果中会有许多关于如何写oracle存储过程返回表结果的,都提到sys_refcursor这个类型,往往不提及能支持此类型的数据库版本,这里记录下这个“坑”,此类型在9i数据库之的版本才有,用到的同学注意了9i之前的数据库是不支持此类型的。
如下定义存储过程,做为示例和测试,它仅有一个入参数,一个出参是sys_refcursor 类型用于表示游标::
CREATE OR REPLACE PROCEDURE SP_CURS(TAB_NAME IN VARCHAR2,
RST OUT SYS_REFCURSOR) IS
BEGIN
OPEN RST FOR
SELECT T.TABLE_NAME
FROM USER_TABLES T
UNION ALL
SELECT 'user-arg:' || TAB_NAME
FROM DUAL;
END SP_CURS;
测试这个存储过程时,又发现一个坑“”,开发db时,都会用到pl/sql developer等工具,其提供的command window窗口通常在这里直接敲命令,测试以上存储过程需要先定义一个游标类型的变量,游标类型是refcursor,然后通过exec执行存储过程,代码如下 :
SQL> var c1 sys_refcursor
SYS_REFCURSOR unknown datatype
SQL>
看到问题了吧,“SYS_REFCURSOR unknown datatype”,后来在网上又搜索到关于这个的解决办法,有人说“SYS_REFCURSOR”只能在sqlplus中使用才行,试了下果然可用,以下是完整的测试代码:
C:\Users\user>sqlplus dawn/dawn@192.168.145.210/sfy
SQL*Plus: Release 11.2.0.2.0 Production on 星期一 11月 23 12:44:06 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> var c refcursor;
SQL> exec sp_curs('soome key',:c);
PL/SQL 过程已成功完成。
SQL> print :c;
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_CODE_INFO
DAWN_AUTOUPDATE_PARAM
DAWN_LICENSE_LIC
MP_SQL
DAWN_PRM_RESOURCE
DAWN_CODE_TYPE
DAWN_CORE_DBLOG
DAWN_FD_CONTAINER
DAWN_PRM_USER
DAWN_PRM_FUNCGROUP_USER
DAWN_PRM_ROLE_RESOURCE
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_PRM_DEPT_ROLE
DAWN_PRM_DEPT_USER
DAWN_PRM_DEPT_ROLE_USER
DAWN_CTRLPARAM_INFO
DAWN_SCHEDULING_JOB
DAWN_SCHEDULING_JOBMONITOR
DAWN_PRM_ROLE
DAWN_ORG_DEPT
DAWN_ORG_EMPL
DAWN_AUTOUPDATE_RESADDRESS
DAWN_USER_CTRLPARAM_INFO
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_PRM_PRIV_MEANING
DAWN_PRM_FG_DEPT_USER_PRIV
DAWN_PRM_DEPTSTRUCT
DAWN_ORG_EMPL_SIGN
DAWN_NUMGEN_SEQRULE
DAWN_I18N_LANG
DAWN_I18N_ITEM
DAWN_AUTOUPDATE_RESOURCE
user-arg:soome key
已选择31行。
SQL>
这是今天一个小时工作时间内遇到的问题,并记录下来,希望能帮到有机会看到此问题的同学。
在百度搜索结果中会有许多关于如何写oracle存储过程返回表结果的,都提到sys_refcursor这个类型,往往不提及能支持此类型的数据库版本,这里记录下这个“坑”,此类型在9i数据库之的版本才有,用到的同学注意了9i之前的数据库是不支持此类型的。
如下定义存储过程,做为示例和测试,它仅有一个入参数,一个出参是sys_refcursor 类型用于表示游标::
CREATE OR REPLACE PROCEDURE SP_CURS(TAB_NAME IN VARCHAR2,
RST OUT SYS_REFCURSOR) IS
BEGIN
OPEN RST FOR
SELECT T.TABLE_NAME
FROM USER_TABLES T
UNION ALL
SELECT 'user-arg:' || TAB_NAME
FROM DUAL;
END SP_CURS;
测试这个存储过程时,又发现一个坑“”,开发db时,都会用到pl/sql developer等工具,其提供的command window窗口通常在这里直接敲命令,测试以上存储过程需要先定义一个游标类型的变量,游标类型是refcursor,然后通过exec执行存储过程,代码如下 :
SQL> var c1 sys_refcursor
SYS_REFCURSOR unknown datatype
SQL>
看到问题了吧,“SYS_REFCURSOR unknown datatype”,后来在网上又搜索到关于这个的解决办法,有人说“SYS_REFCURSOR”只能在sqlplus中使用才行,试了下果然可用,以下是完整的测试代码:
C:\Users\user>sqlplus dawn/dawn@192.168.145.210/sfy
SQL*Plus: Release 11.2.0.2.0 Production on 星期一 11月 23 12:44:06 2015
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> var c refcursor;
SQL> exec sp_curs('soome key',:c);
PL/SQL 过程已成功完成。
SQL> print :c;
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_CODE_INFO
DAWN_AUTOUPDATE_PARAM
DAWN_LICENSE_LIC
MP_SQL
DAWN_PRM_RESOURCE
DAWN_CODE_TYPE
DAWN_CORE_DBLOG
DAWN_FD_CONTAINER
DAWN_PRM_USER
DAWN_PRM_FUNCGROUP_USER
DAWN_PRM_ROLE_RESOURCE
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_PRM_DEPT_ROLE
DAWN_PRM_DEPT_USER
DAWN_PRM_DEPT_ROLE_USER
DAWN_CTRLPARAM_INFO
DAWN_SCHEDULING_JOB
DAWN_SCHEDULING_JOBMONITOR
DAWN_PRM_ROLE
DAWN_ORG_DEPT
DAWN_ORG_EMPL
DAWN_AUTOUPDATE_RESADDRESS
DAWN_USER_CTRLPARAM_INFO
TABLE_NAME
--------------------------------------------------------------------------------
DAWN_PRM_PRIV_MEANING
DAWN_PRM_FG_DEPT_USER_PRIV
DAWN_PRM_DEPTSTRUCT
DAWN_ORG_EMPL_SIGN
DAWN_NUMGEN_SEQRULE
DAWN_I18N_LANG
DAWN_I18N_ITEM
DAWN_AUTOUPDATE_RESOURCE
user-arg:soome key
已选择31行。
SQL>
这是今天一个小时工作时间内遇到的问题,并记录下来,希望能帮到有机会看到此问题的同学。
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- Tomcat端口被占用解决方法(不用重启)
- 数据库自动备份脚本
- “传奇”图象数据存储方式
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析