查看: 20233|回复: 10

[PL/SQL] 弱问:关于plsql的函数,返回多个值

[复制链接]
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
跳转到指定楼层
1#
发表于 2012-9-9 13:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
刚刚韩顺平oracle视频讲到:
函数用于返回特定的数据,一般来讲一个函数返回一个值,和java一样。
请问他只是提到一般是这样,那么函数在特殊用法下不能返回多个值吗?
比如下面的过程(实现select时字段如果全是null值,不显示这个字段,否则显示):
CREATE OR REPLACE PROCEDURE print_corp(v_cur OUT Sys_Refcursor)
  AS
  v_count NUMBER;
  BEGIN
  SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '01%'and sealeddate IS NOT NULL;
  IF v_count >0 THEN
  OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
  ELSE
  OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
  END IF;
  END;
上面实现了多个值写入了游标中,然后打开游标,实现了过程返回多个值。
请问函数不可以使用游标吗?如果可以的话,不就可以返回多个值了吗?
ps:本人刚入门plsql编程,求大侠帮助。

论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00双黄蛋
日期:2013-01-15 18:40:31优秀写手
日期:2014-01-03 06:00:17
2#
发表于 2012-9-9 23:03 | 只看该作者
CREATE OR REPLACE FUNCTION func_emp_dept
(bs_insured_id IN bs_insured.indi_id%TYPE)
RETURN SYS_REFCURSOR
IS
po_result SYS_REFCURSOR;
BEGIN
OPEN po_result FOR
SELECT * FROM bs_insured  WHERE indi_id<=bs_insured_id;
RETURN po_result;
END;
返回的是游标对象

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
3#
 楼主| 发表于 2012-9-10 21:05 | 只看该作者
eric0435 发表于 2012-9-9 23:03
CREATE OR REPLACE FUNCTION func_emp_dept
(bs_insured_id IN bs_insured.indi_id%TYPE)
RETURN SYS_R ...

谢谢

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2012-9-10 21:37 | 只看该作者
学习了

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
5#
 楼主| 发表于 2012-9-10 22:22 | 只看该作者
eric0435 发表于 2012-9-9 23:03
CREATE OR REPLACE FUNCTION func_emp_dept
(bs_insured_id IN bs_insured.indi_id%TYPE)
RETURN SYS_R ...

大侠,在我这里的情况,我写了function

CREATE OR REPLACE FUNCTION func_emp_dept
(ucode IN bd_corp.unitcode%TYPE)
RETURN SYS_REFCURSOR
IS
v_count NUMBER;
po_result SYS_REFCURSOR;
BEGIN
  SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode=ucode and sealeddate IS NOT NULL;
  IF v_count >0 THEN
OPEN po_result FOR
SELECT unitcode,unitname,sealeddate FROM bd_corp;
  ELSE
  OPEN po_result FOR SELECT unitcode,unitname FROM bd_corp;
  END IF;
RETURN po_result;
END;
可是执行select func_emp_dept('0105111004') from  dual显示的结果是

我是想让它显示成:

请问游标怎么输出成这个样子?



使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00双黄蛋
日期:2013-01-15 18:40:31优秀写手
日期:2014-01-03 06:00:17
6#
发表于 2012-9-10 22:46 | 只看该作者
isumsen 发表于 2012-9-10 22:22
大侠,在我这里的情况,我写了function

CREATE OR REPLACE FUNCTION func_emp_dept

那就是只对返国的cursor对象进行处理啊
定义返回结果的类型
type t_fee_rec is record(
    xf  number,
    zsf number);

--每行数据类型

v_feed_rec t_fee_rec;

--定义返回结果类型

type rc is ref cursor return t_fee_rec;
v_fee_cursor rc;

v_fee_cursor := func_emp_dep(indi_id);
--循环获取数据
loop
  --单行数据,注意:返回的v_feed_cursor每行数据按照字段先后顺序与t_fee_record一一对应

  --所以v_feed_rec.xf对应第一个字段(学费)

  fetch v_fee_cursor into v_feed_rec;
  exit when v_fee_cursor%notfound;
  --读取数据并进行处理
  v_xf := v_feed_rec.xf;
  v_zsf := v_feed_rec.zsf;
end loop;

好象没有让函数据返回多行数据且格式和select语句一样的吧,如果你找到了也告诉我一下下

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
7#
 楼主| 发表于 2012-9-10 23:11 | 只看该作者
我更改了一下function的写法,在每个写入游标的select语句增加了where unitcode=ucode,否则肯定不对。
CREATE OR REPLACE FUNCTION func_emp_dept
(ucode IN bd_corp.unitcode%TYPE)
RETURN SYS_REFCURSOR
IS
v_count NUMBER;
po_result SYS_REFCURSOR;
BEGIN
  SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode=ucode and sealeddate IS NOT NULL;
  IF v_count >0 THEN
OPEN po_result FOR
SELECT unitcode,unitname,sealeddate FROM bd_corp  WHERE unitcode=ucode;
  ELSE
  OPEN po_result FOR SELECT unitcode,unitname FROM bd_corp  WHERE unitcode=ucode;
  END IF;
RETURN po_result;
END;
现在的问题是我运行这个function:select func_emp_dept('0105111004') from  dual
只可以在sqlplus不可以在PL/SQL Developer,否则PL/SQL Developer得到的是一个cursor而不是结果

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
8#
 楼主| 发表于 2012-9-10 23:14 | 只看该作者
isumsen 发表于 2012-9-10 23:11
我更改了一下function的写法,在每个写入游标的select语句增加了where unitcode=ucode,否则肯定不对。
CR ...

见下图,sqlplus可以

PL/SQL Developer不可以

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
9#
 楼主| 发表于 2012-9-10 23:32 | 只看该作者
isumsen 发表于 2012-9-10 23:14
见下图,sqlplus可以

PL/SQL Developer不可以

sqlplus的显示结果太丑了,能在PL/SQL Developer显示就好了

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
10#
 楼主| 发表于 2012-9-11 00:29 | 只看该作者
CREATE OR REPLACE FUNCTION func_emp_dept
(ucode varchar)
RETURN SYS_REFCURSOR
IS
v_count NUMBER;
po_result SYS_REFCURSOR;
BEGIN
  SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like ucode||'%' and sealeddate IS NOT NULL;
  IF v_count >0 THEN
OPEN po_result FOR
SELECT unitcode,unitname,sealeddate FROM bd_corp  WHERE  unitcode like   ucode||'%';
  ELSE
  OPEN po_result FOR SELECT unitcode,unitname FROM bd_corp  WHERE unitcode like ucode||'%';
  END IF;
RETURN po_result;
END;
这样运行的时候可以select func_emp_dept('01) from  dual

使用道具 举报

回复

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

本版积分规则 发表回复

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