Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

MySQL Procedure Problem mit "set-Zuweisung"

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von infinityfan, 21 August 2012.

  1. infinityfan

    infinityfan Neuer Benutzer

    Ersteinmal Hallo miteinander. Ich hab grad n ziemliches Problem mit einer SQL Procedure.... Zum Hintergrund: N Kollege und ich haben uns entschlossen die Institution an der wir studieren in einer Datenbank abzubilden und ne kleine Stundenplan-Generierung (Frontend) zu erstellen. Das Einfügen und Anpassen von Kursen wird über Procedures geregelt.
    Nun hänge ich aber beim Insert fest. Der Variable "varLektionsnummer" sollte per set varLektionsnummer = ("SQL-Query"); ein int-Wert zugewisen werden, jedoch weisst die Variable immer den Wert "null" auf.
    Wenn ich den select-Befehl einzeln ausführe kriege ich eine einzige Angabe zurück, genau wie gewünscht. Weise ich "varLektionsnummer" eine Zahl zu, z.B. ('9'); wird diese zugewiesen und in die DB geschrieben.

    Jetzt meine Frage: Woran könnte das liegen? Eine Zuweisung ist ja so wies aussieht möglich. Schonmal vielen Dank für eure Antworten.

    Code:
    BEGIN
     
    declare varKlasse int;
    declare varKlassengroesse int;
    declare varFach int;
    declare varPerson int;
    declare varFunktion int;
    declare varFachDoz int;
    declare varZimmer int;
    declare varZimmertyp int;
    declare varZimmergroesse int;
    declare varDatum int;
    declare varLektionsnummer int;
    declare varZimmerBesetzt int;
    declare varBelegung int;
    declare varDozentBesetzt int;
    declare varKlasseBesetzt int;
    declare varPersonenschnittstelle int;
    declare varUseZimmertyp int;
     
     
    set varKlasse = (select ID from klasse where Bezeichnung = KlasseIN);
    set varKlassengroesse = (select Klassengrösse from klasse where ID = varKlasse);
    set varPerson = (select ID from person where name = DozentNameIN and vorname = DozentVornameIN);
    set varFunktion = (select Abteilung_ID_fk from Personenschnittstelle where Abteilung_ID_fk = 1 and Person_ID_fk = varPerson);
    set varFach = (select ID from Fach where FachIN = Bezeichnung);
    set varFachDoz = (select Fach_ID_fk from Personenschnittstelle where Fach_ID_fk = varfach and Person_ID_fk = varPerson);
    set varZimmer = (select ID from zimmer where Zimmernummer = ZimmerIN);
    set varZimmertyp  = (select Zimmertyp_ID_fk from zimmer where Zimmernummer = ZimmerIN);
    set varZimmergroesse  = (select Kapazitaet from zimmer where Zimmernummer = ZimmerIN);
    set varDatum = (select Datum from Belegung where Datum = DatumIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN and Zimmer_ID_fk_bel = varZimmer);
     
    set varLektionsnummer = (select Distinct Unterrichtszeit_Lektionsnummer_fk from Belegung where Datum = DatumIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN and Zimmer_ID_fk_bel = varZimmer); -- Zuweisung funktoniert NICHT
    set varLektionsnummer = ('9'); -- Zuweisung funktioniert einwandfrei.
     
    set varZimmerBesetzt = (select Zimmer_ID_fk_bel from Belegung where Datum = DatumIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN and Zimmer_ID_fk_bel = varZimmer);
    set varPersonenschnittstelle = (select Distinct Personenschnittstelle_ID_fk from Belegung bel INNER JOIN Personenschnittstelle ps ON bel.Personenschnittstelle_ID_fk = ps.ID where Person_ID_fk = varPerson);
     
     
     
     
     
    -- ‹berpr¸fung, ob Klasse vorhanden.
    IF varKlasse is null then
    Signal SQLSTATE '45000'
    set MESSAGE_TEXT = 'Die Klasse ist nicht vorhanden';
    END IF;
     
     
    -- ‹berpr¸fen, ob eine Person vorhanden ist.
    IF varPerson is null then
    Signal SQLSTATE '45002'
    set MESSAGE_TEXT = 'Die Person ist nicht vorhanden';
    END IF;
     
     
    -- ‹berpr¸fen, ob eine bestimmte Person auch Dozent ist.
    IF varFunktion is null then
    Signal SQLSTATE '45003'
    set MESSAGE_TEXT = 'Die Person ist vorhanden aber kein Dozent';
    END IF;
     
     
    -- ‹berpr¸fen, ob ein Dozent auch ein Fach geben kann.
    IF varFachDoz is null then
    Signal SQLSTATE '45004'
    set MESSAGE_TEXT = 'Die Person ist vorhanden und Dozent aber nich f¸r dieses Fach';
    END IF;
     
     
    -- ‹berpr¸fen, ob ein Zimmer vorhanden ist.
    IF varZimmer is null then
    Signal SQLSTATE '45005'
    set MESSAGE_TEXT = 'Das Zimmer existiert nicht';
    END IF;
     
     
    -- ‹berpr¸fen, ob ein Zimmer die gew¸nschten Ger‰te hat (z.B.:PC).
    IF varZimmertyp not like varZimmerBesetzt then
    Signal SQLSTATE '45006'
    set MESSAGE_TEXT = 'Der Unterricht zum gew¸nschten Fach kann nicht im gew¸nschten Zimmer durchgef¸hrt werden, da die Ausr¸stung nicht stimmt.';
    END IF;
     
     
    -- ‹berpr¸fen, ob die Zimmergrˆsse passend ist.
    If varZimmergroesse < varklassengroesse then
    Signal SQLSTATE '45007'
    set MESSAGE_TEXT = 'Die Zimmergroesse ist unpassend';
    END IF;
     
     
    -- Ueberpruefen, ob ein Zimmer besetzt ist, zu einer gewissen Zeit.
    set varBelegung = (select Belegungsnummer from Belegung where Datum = DatumIN and Zimmer_ID_fk_bel = ZimmerIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN);
     
    IF varBelegung is not null then
    Signal SQLSTATE '45008'
    set MESSAGE_TEXT = 'Das gewuenschte Zimmer ist innerhalb der gewuenschten Zeit schon besetzt';
    END IF;
     
     
     
     
     
    -- Ueberpruefen, ob ein Dozent besetzt is.
    set varDozentBesetzt = (select count(*) from Belegung bel INNER JOIN Personenschnittstelle ps ON bel.Personenschnittstelle_ID_fk = ps.ID INNER JOIN Person p ON ps.Person_ID_fk = p.ID where bel.Datum = DatumIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN and varperson = Person_ID_fk);
     
    IF varDozentBesetzt > 0 then
    Signal SQLSTATE '45009'
    set MESSAGE_TEXT = 'Der gewuenschte Dozent ist leider besetzt';
    END IF;
     
     
     
     
     
    -- Ueberpruefen, ob eine Klasse bereits in einer gewissen Zeit Unterricht hat.
    set varKlasseBesetzt = (select count(*) from Belegung bel INNER JOIN Personenschnittstelle ps ON bel.Personenschnittstelle_ID_fk = ps.ID INNER JOIN Klasse k ON ps.Klasse_ID_fk = k.ID where Datum = DatumIN and Unterrichtszeit_Lektionsnummer_fk = LektionsnummerIN and varklasse = Klasse_ID_fk_bel);
     
    IF varKlasseBesetzt > 0 then
    Signal SQLSTATE '45009'
    set MESSAGE_TEXT = 'Die Klasse hat bereits schon Unterricht in diesem Zeitraum';
    END IF;
     
     
    -- Stundenplan buchen Teil1.
    insert into Belegung  (Klasse_ID_fk_bel, Unterrichtszeit_Lektionsnummer_fk, Fach_ID_fk_bel, Datum, Zimmer_ID_fk_bel, Personenschnittstelle_ID_fk)
    values (varKlasse, varLektionsnummer, varFach, DatumIN, varZimmer, varPersonenschnittstelle);
    Signal SQLSTATE '45010'
    set MESSAGE_TEXT = 'Der Unterricht wurde erfolgreich gebucht :)';
     
     
     
    -- Stundenplan buchen Teil2.
     
    -- insert into Personenschnittstelle (Person_ID_fk)
     
    --values (varPerson);
     
    --Signal SQLSTATE '45010'
     
    --set MESSAGE_TEXT = 'Der Unterricht wurde erfolgreich gebucht_Teil2';
     
     
    END
    
     
  2. ukulele

    ukulele Datenbank-Guru

    Können da eventuell mehrere Ergebnisse in der Unterabfrage zurück gegeben werden?
    Handelt es sich bei Unterrichtszeit_Lektionsnummer_fk um eine Spalte vom Datentyp INT?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden