Prozedure in MySQl erstellen auf hierarchische Daten
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->htname.' ('.$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!