楼主: genomics

[精华] 在PL/SQL中如何写返回多行

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2003-4-4 09:47 | 只看该作者

就是使用

ref  cursor

但需要用包

java 可以方便的处理  ref cursor 的
你仔细查查

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
12#
 楼主| 发表于 2003-4-4 09:51 | 只看该作者
补充说明
系统应用:用jsp+tomcat+oracle9i实现B/S结构
需求:在jsp页面中调用javabean,在javabean中调用oracle中的存储过程返回处理结果。
问题:如果存储过程返回的是单个值,没有问题;如果需要存储过程返回多行,没有实现。
我想知道存储过程是不是不能返回多行,如果是的话,我在javabean中用如下方法取多行值,是否能用到oracle中的绑定变量:
PreparedStatement pstmt=con.prepareStatement("select * from gene_info where rownum<?";
pstmt.getInt(1,10);
ResultSet rs=pstmt.executeQuery();

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
13#
 楼主| 发表于 2003-4-4 10:02 | 只看该作者
to:bity_rainy,谢谢你的答复
我前面已用ref cursor试过,结果如下:
我用以下过程处理多行返回,报错:
PLS-00372在一个过程中,return 语句无法包含表达式。
CREATE or replace PACKAGE test_pkg AS
TYPE cursor_type IS REF CURSOR RETURN gene_info%ROWTYPE;
PROCEDURE test_select;
END test_pkg;

create or replace package body test_pkg is
procedure test_select is
result cursor_type;
begin
open result for
select * from gene_info;
return result;
close result;
end test_select;
end test_pkg;

现在的问题是这个test_select过程编译通不过,我已用游标打开,但不知道怎么返回,如果注释掉return result那句,编译就通过。
在javabean中通过以下语句就可以返回的结果集:
CallableStatement stmt = conn.prepareCall("{call test_select}";
ResultSet rs=stmt.executeQuery();

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
14#
发表于 2003-4-4 10:33 | 只看该作者
哈哈,哪有procedure 返回 result 的?
改为 function

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
15#
发表于 2003-4-4 10:35 | 只看该作者
同时返回后还要 close result 干什么??
如果返回前 close 了,那么客户端就没法得到数据了。

使用道具 举报

回复
招聘 : Hadoop大数据库开发
论坛徽章:
39
生肖徽章2007版:猴
日期:2008-01-02 17:35:532010年世界杯参赛球队:阿根廷
日期:2010-07-02 16:05:252010年世界杯参赛球队:加纳
日期:2010-04-26 12:31:372010新春纪念徽章
日期:2010-03-01 11:06:23祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:22生肖徽章2007版:猴
日期:2009-03-10 21:29:55生肖徽章2007版:猴
日期:2009-03-10 21:23:27IT宝贝
日期:2009-02-18 13:00:30生肖徽章2007版:猴
日期:2008-12-25 14:22:01
16#
发表于 2003-4-4 11:01 | 只看该作者
楼上的哥们,请问是不是在function中打开的cursor一定要在end之前close呢?


CREATE OR REPLACE PACKAGE NativeDynamic AS
  TYPE t_RefCur IS REF CURSOR;
  FUNCTION StudentsQuery(p_WhereClause IN VARCHAR2)
    RETURN t_RefCur;
END NativeDynamic;
/
CREATE OR REPLACE PACKAGE BODY NativeDynamic AS
FUNCTION StudentsQuery(p_WhereClause IN VARCHAR2)
    RETURN t_RefCur IS
    v_ReturnCursor t_RefCur;
    v_SQLStatement VARCHAR2(500);
  BEGIN
    -- Build the query using the supplied WHERE clause
    v_SQLStatement := 'SELECT * FROM students ' || p_WhereClause;

    -- Open the cursor variable, and return it.
    OPEN v_ReturnCursor FOR v_SQLStatement;
    RETURN v_ReturnCursor;
     ---这里没有close v_ReturnCursor;
  END StudentsQuery;

  END NativeDynamic;

以上的function对不对呢?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
17#
 楼主| 发表于 2003-4-4 11:06 | 只看该作者
to:nyfor,谢谢你的提醒
刚才我用functionyaa b g gh ,用function的话,只能返回某个值,还是不能返回多行值,请指点一下。

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
18#
发表于 2003-4-4 11:12 | 只看该作者
很抱歉,由于我没做过java开发,所以并不知道如何做。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
19#
 楼主| 发表于 2003-4-4 11:17 | 只看该作者
to :TOM 你提供的方法我试了一下,编译body时出错:
PLS-00201 必须说明标识符g_cursor

我创建的代码如下:
CREATE or replace PACKAGE test_pkg AS
  TYPE g_cursor IS REF CURSOR RETURN gene_info%ROWTYPE;
  function test_select return g_cursor;
END test_pkg;

create or replace package body test_pkg is
  function test_select return g_cursor is
    result g_cursor;
  begin
    open result for
      select * from gene_info;
    return result;
    --close result;
  end test_select;
end test_pkg;

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
20#
 楼主| 发表于 2003-4-4 11:21 | 只看该作者
查了oracle很多资料,还是没有找到,可能oralce的存储过程是不能返回多行的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表