In SQL-variable mehr als 1 Ergebnis?

shakeya

Neuer Benutzer
Beiträge
1
Hallo,

ich weiß nun echt nicht mehr was ich machen soll. Und zwar habe ich eine stored_Procedure angelegt die einen User, samt seiner Bestellung löschen soll:

Code:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
 
CREATE DEFINER=`dapro04`@`%` PROCEDURE `StoredProcedure_DELETEUSER`(IN custID INT(5))
BEGIN
    DECLARE TempOrderID INT;
    DECLARE counter INT;
    SELECT COUNT(*) INTO counter FROM order1 WHERE order1.CustomerID = custID;
 
    WHILE counter > 0 DO 
[COLOR=#ff0000]    SELECT OrderID INTO TempOrderID FROM order1 WHERE CustomerID = custID;  [/COLOR]
    DELETE FROM payment WHERE payment.OrderID = TempOrderID;
    DELETE FROM order_Detail WHERE order_Detail.OrderID = TempOrderID;
    DELETE FROM order1 WHERE order1.OrderID = TempOrderID;
    SELECT COUNT(*) INTO counter FROM order1 WHERE order1.CustomerID = custID;
    END WHILE;
 
    DELETE FROM customer WHERE customer.CustomerID = custID;
END

D.h. in der Rot markierten Zeile, versucht er sich die OrderIDs zu ziehen welche eben auf die jeweilige CustomerID passen. Nun kommen dort mehrere OrderIDs, deshalb kommt immer ein Fehler. Gibt es sowas wie Arrays in SQL ? Ich bin leider nicht fündig geworden... wie kann ich das Problem lösen?

Bitte entschuldigt diese Anfängerfrage...

Grüße,
Shakeya

EDIT: ok, es gibt wohl keine Arrays. Könnte ich irgendwie festlegen, dass er wenigstens die erste OrderID die er findet, in die Variable läd.. und das immer so weiter bis einfach keine Einträge mehr gefunden werden? Geht das?
 
Werbung:
Richtig, Arrays gibts nicht. Du kannst natürlich eine Tabelle anlegen, im wesentlichen ist das ja nichts anderes.

Mit LIMIT 1 müsstest du problemlos immer genau einen Datensatz auswählen können.
Code:
SELECT    *
FROM    tabelle
WHERE    1 = 1
LIMIT 1

Du kannst aber auch (in der richtigen Reihenfolge) alles in einer Anweisung Löschen. Es sei denn du arbeitest mit Triggern oder Constraints, die so verschachtelt sind das die DB das nicht zuläßt. Du musst natürlich erst die abhängigen Datensätze (payment, orderdetail) löschen und dann die in der Haupttabelle (order1).

Code:
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
 
CREATE DEFINER=`dapro04`@`%` PROCEDURE `StoredProcedure_DELETEUSER`(IN custID INT(5))
BEGIN
    DELETE FROM payment WHERE payment.OrderID IN ( SELECT OrderID FROM order1 WHERE CustomerID = custID )
    DELETE FROM order_Detail WHERE order_Detail.OrderID IN ( SELECT OrderID FROM order1 WHERE CustomerID = custID )
    DELETE FROM order1 WHERE order1.CustomerID = custID
 
    END WHILE
 
    DELETE F
so in etwa
 
Zurück
Oben