Oracle PLSQL游标嵌套选择案例

时间:2016-12-13 20:33:33

标签: sql oracle plsql nested case

我不能为我的生活弄清楚我做错了什么。我有两个表,其中一个列表包含要查找的ID号,另一个表包含节点和节点的响应。我正在检查是否在一个表中注册了一个具有匹配id号的响应,两个表中都存在id号,但响应有记录或没有记录。预期的输出很简单:

id_num         rec_exists
______         __________
000123         Y
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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

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

但是你可以在单个查询中完成所有这些操作,不需要游标循环,然后在

中进行另一个查询