您的位置:首页 > 数据库 > Oracle

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 存储