[MySQL] Stored Procedure (bzw. Function) und "declare cursor" mittendrin

  • Sonstige

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    [MySQL] Stored Procedure (bzw. Function) und "declare cursor" mittendrin

    Ich versuche, in einer Stored Function in MySQL einen Cursor per "declare" mitten im Code zu deklarieren. Der Grund ist, dass ich den Wert eines Parameters (in der verwendeten Where-Bedingung) erst mitten im Code kenne. Leider müssen alle Declare-Anweisungen zu Beginn der Stored Function kommen und somit bekomme ich eine SQL-Fehlermeldung.

    Hier mein Code:

    SQL-Abfrage

    1. /* Stored Procedure (bzw. Function), um den Titel des
    2. angegebenen Mediums zu ermitteln. Wenn verknüpft mit Film,
    3. dann wird MELI_GET_FILMNAME aufgerufen, ansonsten wird
    4. die Bezeichnung direkt ausgelesen. */
    5. drop function if exists MELI_GET_MEDIUM_NAME;
    6. DELIMITER |
    7. create function MELI_GET_MEDIUM_NAME(pMEDIUM_ID integer unsigned)
    8. returns varchar(255) CHARACTER SET utf8
    9. begin
    10. declare MEDIUM_NAME varchar(255) CHARACTER SET utf8;
    11. declare FILM_ID integer unsigned;
    12. declare SQLC1 cursor for select FILM_LISTE_ID from MELI_FILMLISTE_TO_MEDIENLISTE where MEDIENLISTE_ID = pMEDIUM_ID;
    13. OPEN SQLC1;
    14. FETCH SQLC1 INTO FILM_ID;
    15. IF (FILM_ID > 0) THEN
    16. declare SQLC2 cursor for select MELI_GET_FILMNAME(FILM_ID);
    17. ELSE
    18. declare SQLC2 cursor for select BEZEICHNUNG1 from MELI_MEDIENLISTE where ID = pMEDIUM_ID;
    19. END IF;
    20. CLOSE SQLC1;
    21. OPEN SQLC2;
    22. FETCH SQLC2 INTO MEDIUM_NAME;
    23. CLOSE SQLC2;
    24. return MEDIUM_NAME;
    25. end|
    26. DELIMITER ;

    declare SQLC2 ist die kritische Stelle. Wie kann ich das anders lösen? Man müsste quasi die SQL-Anweisung oben mit einem Platzhalter deklarieren können und dann unten den Platzhalter durch einen Wert ersetzen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich habe die Lösung!

    SQL-Abfrage

    1. /* Stored Procedure (bzw. Function), um den Titel des
    2. angegebenen Mediums zu ermitteln. Wenn verknüpft mit Film,
    3. dann wird MELI_GET_FILMNAME aufgerufen, ansonsten wird
    4. die Bezeichnung direkt ausgelesen. */
    5. drop function if exists MELI_GET_MEDIUM_NAME;
    6. DELIMITER |
    7. create function MELI_GET_MEDIUM_NAME(pMEDIUM_ID integer unsigned)
    8. returns varchar(255) CHARACTER SET utf8
    9. begin
    10. declare MEDIUM_NAME varchar(255) CHARACTER SET utf8;
    11. declare FILM_ID integer unsigned;
    12. select FILMLISTE_ID from MELI_FILMLISTE_TO_MEDIENLISTE where MEDIENLISTE_ID = pMEDIUM_ID into FILM_ID;
    13. IF (FILM_ID is not null) and (FILM_ID > 0) THEN
    14. select MELI_GET_FILMNAME(FILM_ID) into MEDIUM_NAME;
    15. ELSE
    16. select BEZEICHNUNG1 from MELI_MEDIENLISTE where ID = pMEDIUM_ID into MEDIUM_NAME;
    17. END IF;
    18. return MEDIUM_NAME;
    19. end|
    20. DELIMITER ;

    Wie ich gelesen habe, braucht man Cursor nur bei der Rückgabe von mehreren Ergebnissen, bei mir ist es nur jeweils ein Datensatz. Daher konnte ich nun komplett auf Cursor verzichten und es klappt!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum