不太理解,求教!

waveBreaking 2010-08-10 12:37:53

create or replace procedure p
(v_pid article.pid%type)
is
cursor c
is select * from article where pid = v_pid;
v_article c%rowtype;
begin
for v_article in c loop
dbms_output.put_line(v_article.cont);
if(v_article.isleaf = 0) then
p(v_article.id);
end if;
end loop;
end;


在这个递归的存储过程里,为什么每条记录只输出一次呢?
它的输出方法不是应该多次执行了吗?
...全文
120 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqlife 2010-08-10
  • 打赏
  • 举报
回复
if(v_article.isleaf = 0) then
p(v_article.id);
end if;

调试下,是不是没有进入到IF语句里....
waveBreaking 2010-08-10
  • 打赏
  • 举报
回复
郁闷,被递归给绕头晕了,绕出来了,谢楼上了。
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hidanger0 的回复:]
引用 13 楼 wavebreaking 的回复:
不太懂什么意思,当P(1)的时候

不是应该输出‘大象被打趴下了’和‘怎么可能’吗?

如果递归的话,在输出
‘大象被打趴下了’会继续找 2
通过2会找到 '蚂蚁也不好过' 会继续找 3
'瞎说' 会继续找 4
'大象进医院了'会继续找 9

‘怎么可能’会继续找 6

不全写了,感觉是这样的
[/Quote]

‘大象被打趴下了’会继续找 2
通过2会找到
##########'蚂蚁也不好过' 会继续找 3
##########'瞎说' 会继续找 4
##########'大象进医院了'会继续找 9
‘怎么可能’会继续找 6
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wavebreaking 的回复:]
不太懂什么意思,当P(1)的时候

不是应该输出‘大象被打趴下了’和‘怎么可能’吗?
[/Quote]
如果递归的话,在输出
‘大象被打趴下了’会继续找 2
通过2会找到 '蚂蚁也不好过' 会继续找 3
'瞎说' 会继续找 4
'大象进医院了'会继续找 9

‘怎么可能’会继续找 6

不全写了,感觉是这样的
waveBreaking 2010-08-10
  • 打赏
  • 举报
回复
不太懂什么意思,当P(1)的时候

不是应该输出‘大象被打趴下了’和‘怎么可能’吗?
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hidanger0 的回复:]
1
2
3
4
5
9
10
6
7
8
以上是p(0)执行的过程
[/Quote]
1
########2
################3
################4
########################5
################9
########################10
########6
################7
################8
纵向是循环值
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
1
2
3
4
5
9
10
6
7
8
以上是p(0)执行的过程
waveBreaking 2010-08-10
  • 打赏
  • 举报
回复
这的确是一个遍历树形结构,因为有些属性和我问题无关,所以去掉了

让我困惑的问题是这样的

表里面有这样几条记录
1, '蚂蚁大战大象', 0,……
2, '大象被打趴下了', 1, ……
3, '蚂蚁也不好过', 2, ……
4, '瞎说', 2, ……
5, '没有瞎说', 4, ……
6, '怎么可能', 1, ……
7, '怎么没有可能', 6, ……
8, '可能性是很大的', 6, ……
9, '大象进医院了', 2, ……
10, '护士是蚂蚁', 9, ……

执行P(0)以后的遍历结果是这样
蚂蚁大战大象
大象被打趴下了
蚂蚁也不好过
瞎说
没有瞎说
大象进医院了
护士是蚂蚁
怎么可能
怎么没有可能
可能性是很大的

然后我把代码改下去掉递归

create or replace procedure p
(v_pid article.pid%type)
is
cursor c
is select * from article where pid = v_pid;
v_article c%rowtype;
begin
for v_article in c loop
dbms_output.put_line(v_article.cont);
end loop;
end;

执行p(2)结果是
蚂蚁也不好过
瞎说
大象进医院了

为什么‘没有瞎说’会插在‘大象进医院了’之前呢?
cnwz 2010-08-10
  • 打赏
  • 举报
回复
这个应该可以用分析函数直接一条SQL出来结果吧,没必要弄得这么复杂啊
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
总感觉这段代码逻辑不是很清楚,如果是想做遍历树形结构的话,应该有叶子所属节点吧。。
waveBreaking 2010-08-10
  • 打赏
  • 举报
回复
if(v_article.isleaf = 0) then有点干扰,去掉好了

create or replace procedure p
(v_pid article.pid%type)
is
cursor c
is select * from article where pid = v_pid;
v_article c%rowtype;
begin
for v_article in c loop
dbms_output.put_line(v_article.cont);
p(v_article.id);
end loop;
end;
waveBreaking 2010-08-10
  • 打赏
  • 举报
回复
这个代码没什么问题的,是我问题问错了

我对这段代码有些部分理解的不太透彻

求教代码具体的执行过程
hidanger0 2010-08-10
  • 打赏
  • 举报
回复
需要表结构及业务逻辑进行支撑,从表面上看没什么问题。。
luocb1980 2010-08-10
  • 打赏
  • 举报
回复
1. 你这个cursor能返回多条记录吗?
2. 确定是否有 if(v_article.isleaf = 0)
3. 你这个procedure容易一起死循环。
ngx20080110 2010-08-10
  • 打赏
  • 举报
回复
if(v_article.isleaf = 0) then
p(v_article.id);
end if;
從字面上,我猜isleaf是值是否是子葉,
所以,條件應該改為v_article.isleaf != 0
心中的彩虹 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 wavebreaking 的回复:]
SQL code

create or replace procedure p
(v_pid article.pid%type)
is
cursor c
is select * from article where pid = v_pid;
v_article c%rowtype;
begin
for v_article in c loop
dbms_……
[/Quote]
关键看你的过程体中的判断是否起作用

你是想嵌套循环游标 多次输出 会报错的

17,377

社区成员

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

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