簡體   English   中英

Oracle PLSQL游標嵌套選擇大小寫

[英]Oracle PLSQL cursor nested select 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; 

結束;

我認為此查詢將為您提供沒有光標的結果:

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沒有意義,這是交叉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;

有多個問題。

第一:您應該將案例結果保存到變量中,缺少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

或類似的東西,取決於您的桌子

但是您可以在單個查詢中完成所有這些操作,而無需進行游標循環,然后在內部進行另一個查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM