Korrekte Art zu überprüfen, ob eine Zeile in der Tabelle [pl / sql block] existiert
Wurde ich schriftlich einige Aufgaben gestern und es fiel mir auf, dass ich nicht wirklich weiß, DIE ANGEMESSENE und AKZEPTIERTE Art und Weise zu prüfen, ob Zeile existiert in der Tabelle, wenn ich Sie mit pl/sql.
Beispiele für die sake-let ' s benutzen Sie die Tabelle
PERSON(ID, Name);
Natürlich habe ich kann nicht (es sei denn, es gibt einige geheime Methode) so etwas wie:
BEGIN
IF EXISTS SELECT id FROM person WHERE ID = 10;
-- do things when exists
ELSE
-- do things when doesn't exist
END IF;
END;
Also mein standard-Weg, es zu lösen war:
DECLARE
tmp NUMBER;
BEGIN
SELECT id INTO tmp FROM person WHERE id = 10;
--do things when record exists
EXCEPTION
WHEN no_data_found THEN
--do things when record doesn't exist
END;
Aber ich weiß nicht, ob es angenommen wird, ist Weg, es zu tun, oder ob es irgendeine bessere Möglichkeit, zu überprüfen, würde ich wirklich apprieciate, wenn jemand könnte teilen Ihre Weisheit mit mir 🙂
Cheers.
Kommentar zu dem Problem
Warum wollen Sie das tun? Was ist der echte ein problem, das Sie lösen möchten.
Ich habe keine bestimmten Problem (im moment zumindest), es fiel mir auf, dass, Wenn ich hatte zu tun, einige ernsthafte Aufgabe für echte Firma würde ich nicht wissen, ob es erlaubt die Verwendung dieser trick mit Ausnahme ist oder nicht.
Es hängt alles davon ab, was Sie tun möchten. Wenn Sie wollen update/insert Zeug, je nachdem, ob die Zeile gibt es eine
merge
ist wohl die bessere alternative. Ich denke, der kann andere Wege, um damit umzugehen, aber das hängt davon ab, was genau das problem ist. pl/sql, falls vorhanden Abhilfe - stackoverflow.com/questions/13217600/...
InformationsquelleAutor der Frage devBem | 2014-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde nicht schieben regelmäßige code in einen exception-block. Prüfen Sie einfach, ob alle Zeilen vorhanden sind, die sich Ihren Zustand und gehen von dort aus:
InformationsquelleAutor der Antwort David Aldridge
IMO-code für eine stand-alone-WÄHLEN Sie prüfen, um zu sehen, ob eine Zeile vorhanden, in einer Tabelle nicht ordnungsgemäße Vorteil der Datenbank. In deinem Beispiel hast du die hard-coded-ID-Wert, aber das ist nicht, wie apps in der "realen Welt" (zumindest nicht in meine Welt - yours kann unterschiedlich sein :-). In einer typischen Anwendung, die Sie gehen, um einen cursor, verwenden, Daten zu finden - also sagen wir mal du hast eine app, ist der Blick auf die Daten für die Rechnung, und muss wissen, ob der Kunde existiert. Der Hauptteil der app könnte etwas wie
und in der
-- do something here
Sie möchten, um herauszufinden, ob der Kunde vorhanden ist, und falls nicht eine Fehlermeldung ausgegeben.Einen Weg, dies zu tun wäre, in einer Art von singleton-WÄHLEN Sie, wie in
aber IMO ist das aber relativ langsam und fehleranfällig. IMO der Bessere Weg (tm), dies zu tun ist, um es in der Haupt-cursor:
Dieser code setzt auf PERSON.ID erklärt wird, wie die PRIMARY KEY auf die PERSON (oder zumindest als not NULL); die Logik ist, dass, wenn die PERSON-Tabelle wird in der äußeren trat auf die Abfrage, und die PERSON_ID kommt als NULL, bedeutet es, dass keine Zeile fand sich in PERSON für die gegebene CUSTOMER_ID weil PERSON.ID muss einen Wert haben (also zumindest NICHT NULL).
Teilen und genießen.
InformationsquelleAutor der Antwort Bob Jarvis
Viele Möglichkeiten, um die Haut dieser Katze. Ich habe eine einfache Funktion in jeder Tabelle-Paket...
Macht Ihre Prüfungen wirklich sauber...
InformationsquelleAutor der Antwort gfrobenius
Diese Aussage ergibt 0, wenn es keine Zeilen gibt, die 1, wenn Sie mindestens eine Zeile in dieser Tabelle. Es ist viel schneller als ein select count(*). Der Optimierer "sieht", dass nur eine einzelne Zeile muss abgerufen werden, um die Frage zu beantworten.
Hier eine (ausführliche) kleines Beispiel:
InformationsquelleAutor der Antwort Andreas Wismann
InformationsquelleAutor der Antwort Mohsen Heydari
Wenn Sie mit einem expliziten cursor, sollte Es wie folgt sein.
InformationsquelleAutor der Antwort Dinidu Hewage