Prozedure in MySQl erstellen auf hierarchische Daten

edit | delete

Autor: Milindi Lwanga-Buchholz

eingetragen: Donnerstag, 09. Juli 2015 um 13:44 Uhr (28/2015 Kalenderwoche)

geändert: Donnerstag, 09. Juli 2015 um 13:53 Uhr (28/2015 Kalenderwoche)

Keywords: Stored Procedure childs parent kinder eltern

Kategorien: DB: MySQL, DB: MariaDB,

Text:

Stored Procedure mit MySQL siehe Quellcode.


Der Aufruf kann wie folgt stattfinden:
1. Stored Procedure mit MyphpAdmin abrufen:
CALL prozedur_alle_kinder_von_id('21');


2. Stored Procedure in PHP abrufen
$sql = ‘Call prozedur_alle_kinder_von_id(164)’;
$results = $mysqli->query($sql);
While ($row = $results->fechtobject()){
echo $row->ht
name.' ('.$row->ht_update.')';
}


siehe auch
- http://www.mysqltutorial.org/getting-started-with-mysql-stored-pro...


- https://dev.mysql.com/doc/refman/5.0/en/create-procedure.html


- https://search.oracle.com/search/search?q=procedure&group=MySQL

Quellcode:  

-- ==================================================
-- PROCEDURE "prozedur_alle_kinder_von_id(?)"
--
-- Insgesamt benoetigte Tabellen:
--    - datenbank.hierarchieTabelle
--
-- PROCEDURE gibt zurueck:
-- - alle Childs und SUB-Childs der Einrichtung-ID
-- - bis maximal zur 6. Ebene
--
-- Beispiele fuer Abfrage:
-- SET @p0='21'; CALL `prozedur_alle_kinder_von_id`(@p0);

-- CALL `prozedur_alle_kinder_von_id`('21');
-- ==================================================

DELIMITER //
CREATE PROCEDURE datenbank.prozedur_alle_kinder_von_id(eltern_id INT)
	deterministic READS SQL DATA
BEGIN
    SELECT  tabelle.ht_id AS ht_id,
            tabelle.ht_parent_id AS ht_parent_id,
            tabelle.ht_name AS ht_name,
            tabelle.ht_update AS ht_update
    FROM    datenbank.hierarchieTabelle AS tabelle
    WHERE  tabelle.ht_parent_id  = eltern_id
    OR  tabelle.ht_parent_id IN
           (SELECT a1.ht_id
            FROM   datenbank.hierarchieTabelle AS a1
            WHERE  a1.ht_parent_id  = eltern_id)
    OR tabelle.ht_parent_id IN
       (SELECT a2.ht_id
        FROM   datenbank.hierarchieTabelle AS a2
        WHERE  a2.ht_parent_id IN
            (SELECT b2.ht_id
            FROM   datenbank.hierarchieTabelle AS b2
            WHERE  b2.ht_parent_id  = eltern_id)
        )
    OR tabelle.ht_parent_id IN
       (SELECT a3.ht_id
        FROM   datenbank.hierarchieTabelle AS a3
        WHERE  a3.ht_parent_id IN
            (SELECT b3.ht_id
            FROM   datenbank.hierarchieTabelle AS b3
            WHERE  b3.ht_parent_id  IN
                (SELECT c3.ht_id
                FROM   datenbank.hierarchieTabelle AS c3
                WHERE  c3.ht_parent_id  = eltern_id)
            )
        )
    OR tabelle.ht_parent_id IN
       (SELECT a4.ht_id
        FROM   datenbank.hierarchieTabelle AS a4
        WHERE  a4.ht_parent_id IN
            (SELECT b4.ht_id
            FROM   datenbank.hierarchieTabelle AS b4
            WHERE  b4.ht_parent_id  IN
                (SELECT c4.ht_id
                FROM   datenbank.hierarchieTabelle AS c4
                WHERE  c4.ht_parent_id  IN
                    (SELECT d4.ht_id
                    FROM   datenbank.hierarchieTabelle AS d4
                    WHERE  d4.ht_parent_id  = eltern_id))
            )
        )
    OR tabelle.ht_parent_id IN
       (SELECT a5.ht_id
        FROM   datenbank.hierarchieTabelle AS a5
        WHERE  a5.ht_parent_id IN
            (SELECT b5.ht_id
            FROM   datenbank.hierarchieTabelle AS b5
            WHERE  b5.ht_parent_id  IN
                (SELECT c5.ht_id
                FROM   datenbank.hierarchieTabelle AS c5
                WHERE  c5.ht_parent_id  IN
                    (SELECT d5.ht_id
                    FROM   datenbank.hierarchieTabelle AS d5
                    WHERE  d5.ht_parent_id  IN
                        (SELECT e5.ht_id
                        FROM   datenbank.hierarchieTabelle AS e5
                        WHERE  e5.ht_parent_id  = eltern_id)
                    )
                )
            )
        )
    GROUP BY tabelle.ht_id
    ORDER BY tabelle.ht_archiv ASC, 
             tabelle.ht_orderby ASC,
             tabelle.ht_akronym ASC;

END;
-- Eigentlich sollte hier "END// stehen, 
--    aber das fuehrt zum Fehler!