2016-12-13 7 views
0

Ich kann nicht für das Leben von mir herauszufinden, was ich falsch mache. Ich habe zwei Tabellen eins mit einer Liste von ID-Nummern zu suchen und die andere Tabelle mit den Knoten und Antworten von den Knoten. Ich überprüfe, ob eine Antwort in der einen Tabelle mit einer übereinstimmenden ID-Nummer registriert ist, die ID-Nummern existieren in beiden Tabellen, aber eine Antwort hat entweder Datensätze oder nicht. die erwartete Ausgabe ist einfach:Oracle PLSQL Cursor verschachtelt Fall

id_num   rec_exists 
______   __________ 
00Y 
000124   N 
... 

Hier ist mein Code:

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

Bitte post auch Fehler, die Sie bekommen. – Kacper

Antwort

0

Es gibt mehrere Probleme.

Erstens: Sie sollten Ihren Fall Ergebnis in Variable speichern, INTO

fehlt
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; 

Zweitens: Sie zwei Tabellen in Ihrer Abfrage verwenden und nur eine Bedingung, beabsichtigt, dass war nicht sicher. Wenn beide Tabellen id_num Spalte haben, dann sollten Sie das zu Ihrem Zustand hinzufügen

SELECT * 
FROM computer_node a, 
    node_response b 
WHERE a.id_num = e_rec 
    AND b.id_num = a.id_num 

Oder so ähnlich, je nach Ihren Tabellen

Aber Sie können in einzelnen Abfrage, keine Notwendigkeit für Cursor-Schleife all dies zu tun und dann eine andere Abfrage innerhalb

+0

[Schlechte Angewohnheiten zu treten: Verwenden von alten JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - diese alte * durch Kommas getrennte Liste von Tabellen * style wurde durch die * richtige * ANSI 'JOIN'-Syntax im ANSI - ** 92 ** SQL Standard ersetzt (** vor mehr als 20 Jahren **) und seine Verwendung wird davon abgeraten –

+0

Ich stimme zu, es ist nicht meine Frage, nur c/p der Autoren. Wenn es ihm so gefällt, wen soll ich beurteilen? – BeRightBack

0

Ich denke, diese Abfrage Ihr Ergebnis ohne Cursor geben wird:

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 keinen Sinn machen, das ist Cross-Join. Wenn Sie prüfen möchten, ob die ID in mindestens einer dieser Tabellen vorhanden ist, verwenden Sie full join wie oben. Wenn id_num ist nur in einer dieser Tabellen einzelne Tabelle verwenden, wie unten:

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;