oracle 存储过程 中返回记录集判断有无记录集如何处理

system1190 2011-01-13 09:36:22
CREATE OR REPLACE PROCEDURE test1
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN


open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1;

IF ( 没有记录 ) THEN --请问这个如果处理

SELECT *
INTO v_database from (select 字段1 from 表2)

IF ( 存在记录 ) THEN --请问这个如果处理
open cv_2 for SELECT v_database from dual;
else
操行别的操作
END IF;
END IF;

END;

-------------------
最终得到dataset
...全文
320 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxyzxq2008 2011-01-15
  • 打赏
  • 举报
回复

CREATE OR REPLACE PROCEDURE test1
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN


open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1;

BEGIN
SELECT COUNT(*) INTO CNT FROM 表1 WHERE ROWNUM <= 1;

IF CNT = 0 THEN --no data

SELECT *
INTO v_database from (select 字段1 from 表2)

IF CNT > 0 THEN --have data
open cv_2 for SELECT v_database from dual;
else
操行别的操作
END IF;
END IF;

END;
system1190 2011-01-14
  • 打赏
  • 举报
回复
谁能给个比较好的解决方案
minitoy 2011-01-13
  • 打赏
  • 举报
回复
...第一次的时候为什么要open cv_1,直接计算count(*)不就可以了.
Oraclefans_ 2011-01-13
  • 打赏
  • 举报
回复
怎么不能。。。。我fetch一次我就推出不就行了。。。。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oraclefans_ 的回复:]
你fetch cv_1 into xxx之后,oracle数据会返回个布尔变量给你的,如果有记录就是true,没有记录为false
所以cv_1%found代表有记录,cv_1%notfound代表没有记录,这应该很常用的变量的吧。。。
[/Quote]
我觉得这里不能够去fetch游标 楼主的需求是返回游标里的内容 在过程里不做处理的
Oraclefans_ 2011-01-13
  • 打赏
  • 举报
回复
你fetch cv_1 into xxx之后,oracle数据会返回个布尔变量给你的,如果有记录就是true,没有记录为false
所以cv_1%found代表有记录,cv_1%notfound代表没有记录,这应该很常用的变量的吧。。。
lonenan 2011-01-13
  • 打赏
  • 举报
回复
定义一个dataset变量;然后open 变量 for sql语句;然后判断该变量是否为空就行了
参考一下:
http://topic.csdn.net/u/20110113/10/a25ab493-2793-4ad3-a1f0-ad41e11ec314.html?75821
kingkingzhu 2011-01-13
  • 打赏
  • 举报
回复
那你可以直接open cursor啊 cursor不是有notfound么
但是相比之下 多一次查询 和打开一个游标 个人觉得 还是多一次查询好
毕竟游标也算是资源了
system1190 2011-01-13
  • 打赏
  • 举报
回复
不那相当于检索了两次,
有不有别的建议。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 system1190 的回复:]
我需要返回的记录集,最终返回dataset
[/Quote]
SELECT count(*) into v_flag
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1;
if v_flag=0 then --没有记录
if v_flag>=1 then --有记录
那你加一段这样的语句
system1190 2011-01-13
  • 打赏
  • 举报
回复
我需要返回的记录集,最终返回dataset
  • 打赏
  • 举报
回复
[Quote=引用楼主 system1190 的回复:]
CREATE OR REPLACE PROCEDURE test1
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN


open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表……
[/Quote]
没必要用游标啊

SELECT count(*) into v_flag
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1;
if v_flag=0 then --没有记录
if v_flag>=1 then --有记录
system1190 2011-01-13
  • 打赏
  • 举报
回复
谁能给个比较好的解决方案
lxyzxq2008 2011-01-13
  • 打赏
  • 举报
回复

if cv_1%notfound then
...
else
...
end if

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧