这段代码怎么修改?

[复制链接]
查看11 | 回复9 | 2005-12-23 16:28:18 | 显示全部楼层 |阅读模式
v_count:=0;
WHILE v_count=0
LOOP
SELECT &部门ID INTO v_department_id FROM dual;
--dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
--dbms_output.put_line(v_count);
END LOOP;
我想用如上代码实现如果用户输入的部门ID在department表中不存在就要求用户重新输入!
但是当输入一个不存在的部门ID,比如:1002,时,如上代码被替换为:
v_count:=0;
WHILE v_count=0
LOOP
SELECT 1002INTO v_department_id FROM dual;
sys.dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
dbms_output.put_line(v_count);
END LOOP;
这样只有第一次可以输入,而且输入后就成了死循环!
请教大家实现该功能是如何做的?我的这段代码该如何修改才能实现我想要的功能!
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
最初由 zhpsam 发布
[B]v_count:=0;
WHILE v_count=0
LOOP
SELECT &部门ID INTO v_department_id FROM dual;
--dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
--dbms_output.put_line(v_count);
END LOOP;
我想用如上代码实现如果用户输入的部门ID在department表中不存在就要求用户重新输入!
但是当输入一个不存在的部门ID,比如:1002,时,如上代码被替换为:
v_count:=0;
WHILE v_count=0
LOOP
SELECT 1002INTO v_department_id FROM dual;
sys.dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
dbms_output.put_line(v_count);
END LOOP;
这样只有第一次可以输入,而且输入后就成了死循环!
请教大家实现该功能是如何做的?我的这段代码该如何修改才能实现我想要的功能! [/B]

安装你说的需求,你的写法明显有问题,不知道循环用来干吗的?
写成一个函数,判断一次就可以了啊?
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
最初由 zhpsam 发布
[B]v_count:=0;
WHILE v_count=0
LOOP
SELECT &部门ID INTO v_department_id FROM dual;
--dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
--dbms_output.put_line(v_count);
END LOOP;
我想用如上代码实现如果用户输入的部门ID在department表中不存在就要求用户重新输入!
但是当输入一个不存在的部门ID,比如:1002,时,如上代码被替换为:
v_count:=0;
WHILE v_count=0
LOOP
SELECT 1002INTO v_department_id FROM dual;
sys.dbms_output.put_line(v_department_id);
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=v_department_id;
dbms_output.put_line(v_count);
END LOOP;
这样只有第一次可以输入,而且输入后就成了死循环!
请教大家实现该功能是如何做的?我的这段代码该如何修改才能实现我想要的功能! [/B]


我想可能是NULL的问题,可以这样吗?
v_count:=0;
WHILE v_count=0
LOOP
SELECT 1002INTO v_department_id FROM dual;
sys.dbms_output.put_line(v_department_id);
SELECTNVL(COUNT(*),0)INTO v_count FROM department WHERE department_id=v_department_id;
dbms_output.put_line(v_count);
END LOOP;
没有测试过。
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
最初由 llmleon 发布
[B]

我想可能是NULL的问题,可以这样吗?
v_count:=0;
WHILE v_count=0
LOOP
SELECT 1002INTO v_department_id FROM dual;
sys.dbms_output.put_line(v_department_id);
SELECTNVL(COUNT(*),0)INTO v_count FROM department WHERE department_id=v_department_id;
dbms_output.put_line(v_count);
END LOOP;
没有测试过。 [/B]

还是死循环呀,呵呵
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
department_id是什么类型的啊。或者大小写问题,或空格问题,可以检查一下。因为没有找到数据所以会一直循环下去啊。这是对的啊。
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
我的意思是第一次输入后替换为:SELECT 1002 INTO v_department_id FROM dual;
循环体执行第二次的时候没有那个&符号了,执行的是:SELECT 1002 INTO v_department_id FROM dual;
而不是SELECT &部门IDINTO v_department_id FROM dual;
所以就死循环了,解决这个问题的关键是怎样使循环执行第二次的时候,还是提示用户输入部门id,不知道大家明白没有?
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
一个不存在的部门ID,比如:1002
哪麼
SELECT COUNT(*) INTO v_count FROM department WHERE department_id=1002;
還是v_count=0 啊?
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
关键问题是在:第一次输入后替换为:SELECT 1002 INTO v_department_id FROM dual;
这样循环执行第二次时就不要求用户输入了!
反之,如果第二次还要求用户输入,用户输入了一个存在的ID,下面的count(*) 0,循环就应该结束了阿!
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
最初由 llmleon 发布
[B]department_id是什么类型的啊。或者大小写问题,或空格问题,可以检查一下。因为没有找到数据所以会一直循环下去啊。这是对的啊。 [/B]

要想解决第二次重新接受新数据,可以用函数判断啊,为什么要用循环呢(程序不健壮,容易出现死循环,不人性化)
回复

使用道具 举报

千问 | 2005-12-23 16:28:18 | 显示全部楼层
主要是要实现只要用户输入的部门ID不存在,就要求重新输入!
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行