[英]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.