Oracle PLSQL游标嵌套选择案例
我不能为我的生活弄清楚我做错了什么。我有两个表,其中一个带有要查找的ID号列表,另一个带有来自节点的节点和响应。我正在检查一个响应是否在具有匹配的id号的一个表中注册,id号存在于两个表中,但响应要么有记录要么没有。预期输出很简单:Oracle PLSQL游标嵌套选择案例
id_num rec_exists
______ __________
00Y
000124 N
...
这里是我的代码:
set serveroutput ON
DECLARE
CURSOR c1 IS
SELECT id_num
FROM pcnodes;
i NUMBER := 0;
rec_exists CHAR(20);
b CHAR(20);
BEGIN
FOR e_rec IN c1 LOOP
i := i + 1;
SELECT CASE
WHEN EXISTS (SELECT *
FROM computer_node a,
node_response b
WHERE id_num IN (e_rec))
THEN 'Y'
ELSE 'N'
END AS rec_exists
FROM dual;
dbms_output.Put_line(i
||Chr(20)
||e_rec.id_num
||Chr(20)
||rec_exists);
END LOOP;
END;
存在多个问题。
第一:您应该将案件结果保存到变量,缺少INTO
SELECT CASE
WHEN EXISTS (SELECT *
FROM computer_node a,
node_response b
WHERE id_num IN (e_rec))
THEN 'Y'
ELSE 'N'
END AS rec_exists
INTO rec_exists
FROM dual;
二:您使用在查询两个表,并只有一个条件,不能肯定之意。如果两个表具有id_num
列,那么你应该添加到您的病情
SELECT *
FROM computer_node a,
node_response b
WHERE a.id_num = e_rec
AND b.id_num = a.id_num
或者类似的东西,这取决于你的表
但你可以做到这一切在单一的查询,不需要游标循环然后再另一个查询
[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL标准(**超过20年前的**)中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法它的使用是不鼓励的 –
我同意,这不是我的querry,只是作者的c/p。如果他喜欢那样,我是谁来判断:) – BeRightBack
我觉得这个查询会给你的结果,而不光标:
select nvl(a.id_num, b.id_num) as id, nvl2(p.id_num,'Y','N')
from node_response b
full outer join computer_node a on (a.id_num = b.id_num)
left outer join pcnodes p on (p.id_num = nvl(a.id_num, b.id_num));
FROM computer_node a, node_response b
是没有意义的,这是交叉连接。如果您要检查是否至少有一个表中存在id,则使用full join
。如果id_num
仅在其中一个表中使用如下的单个表格:
select b.id_num, nvl2(p.id_num,'Y','N')
from node_response b
left outer join pcnodes p on (p.id_num = b.id_num;
请发布错误,你越来越。 – Kacper