2016-12-13 106 views
0

我不能为我的生活弄清楚我做错了什么。我有两个表,其中一个带有要查找的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;

+0

请发布错误,你越来越。 – Kacper

回答

0

存在多个问题。

第一:您应该将案件结果保存到变量,缺少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 

或者类似的东西,这取决于你的表

但你可以做到这一切在单一的查询,不需要游标循环然后再另一个查询

+0

[踢坏的习惯:使用旧式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'语法它的使用是不鼓励的 –

+0

我同意,这不是我的querry,只是作者的c/p。如果他喜欢那样,我是谁来判断:) – BeRightBack

0

我觉得这个查询会给你的结果,而不光标:

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;