2016-12-13 103 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;