ich habe eine grundsätzliche Frage zur Verwendung von Views / Stored Procedures in MariaDB / MySQL:
In meinem Programm kommen einige sehr umfangreiche SQL-Abfragen zum Einsatz. Um mir das Handling etwas zu erleichtern und meinen Code besser lesbar zu machen, habe ich mir Views in der Datenbank erzeugt.
Ich habe aber auch Abfragen mit mehreren UNIONs, in welchen ich verschiedene Parameter 'zwischendrin' benötige.
Das ist aber mit Views nicht realisierbar (zumindest nicht einfach).
Deswegen trage ich mich mit dem Gedanken, Stored Procedures zu verwenden, was sehr gut funktioniert.
Mir ist bekant, dass ich durch Stroed Procedures und Views evtl. die Verwendung anderer DB-Systeme ausschließe.
Mein Anliegen:
Gibt es ansonsten weitere Vor-/ Nachteile Stored Procedures statt Views zu verwenden bzw. etwas was generell gegen die Verwendung spricht?
Beispiele (funktioniert beides):
Aufruf View:
SQLQuery1.Close;
SQLQuery1.SQL.Text:= 'SELECT * FROM view_positionssummen where idauftragsposition = ' + FieldByName('idauftragsposition').AsString;
SQLQuery1.Open;
Aufruf Stored Procedure:
SQLQuery1.Close;
SQLQuery1.SQL.Text:= 'CALL get_positionssummen(' + FieldByName('idauftragsposition').AsString + ')';
SQLQuery1.Open;
Letzteres ist auch optisch wesentlich besser!
Hier mal die Definition zur Procedure zur Veranschaulichung

Code: Alles auswählen
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_positionssummen`(IN ID int)
BEGIN
SELECT
`AuftragsPositionen`.`idauftragsposition` AS `idauftragsposition`,
`Steuersaetze`.`steuersatz` AS `steuersatz`,
`AuftragsPositionen`.`apo_rabatt` AS `apo_rabatt`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_zeit`),
2) AS `Szeit`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_lohn`),
2) AS `Slohn`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_service`),
2) AS `Sservice`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_material`),
2) AS `Smaterial`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_geraet`),
2) AS `Sgeraet`,
ROUND((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_fremdleistung`),
2) AS `Sfremdleistung`,
ROUND(((`AuftragsPositionen`.`apo_menge` * ((((`AuftragsPositionen`.`apo_lohn` + `AuftragsPositionen`.`apo_service`) + `AuftragsPositionen`.`apo_material`) + `AuftragsPositionen`.`apo_geraet`) + `AuftragsPositionen`.`apo_fremdleistung`)) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)),
2) AS `SNetto`,
ROUND((((`AuftragsPositionen`.`apo_menge` * ((((`AuftragsPositionen`.`apo_lohn` + `AuftragsPositionen`.`apo_service`) + `AuftragsPositionen`.`apo_material`) + `AuftragsPositionen`.`apo_geraet`) + `AuftragsPositionen`.`apo_fremdleistung`)) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)) * (`Steuersaetze`.`steuersatz` / 100)),
2) AS `SSteuer`,
ROUND((((`AuftragsPositionen`.`apo_menge` * ((((`AuftragsPositionen`.`apo_lohn` + `AuftragsPositionen`.`apo_service`) + `AuftragsPositionen`.`apo_material`) + `AuftragsPositionen`.`apo_geraet`) + `AuftragsPositionen`.`apo_fremdleistung`)) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)) * (1 + (`Steuersaetze`.`steuersatz` / 100))),
2) AS `SBrutto`,
ROUND((((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_lohn`) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)) * (`Steuersaetze`.`steuersatz` / 100)),
2) AS `SLSteuer`,
ROUND((((`AuftragsPositionen`.`apo_menge` * `AuftragsPositionen`.`apo_lohn`) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)) * (1 + (`Steuersaetze`.`steuersatz` / 100))),
2) AS `SLBrutto`,
ROUND((((((`AuftragsPositionen`.`apo_lohn` + `AuftragsPositionen`.`apo_material`) + `AuftragsPositionen`.`apo_service`) + `AuftragsPositionen`.`apo_geraet`) + `AuftragsPositionen`.`apo_fremdleistung`) * ((100 - `AuftragsPositionen`.`apo_rabatt`) * 0.01)),
2) AS `EPNetto`
FROM
(`AuftragsPositionen`
LEFT JOIN `Steuersaetze` ON ((`AuftragsPositionen`.`fk_steuersatz` = `Steuersaetze`.`idsteuersatz`)))
WHERE idauftragsposition = ID;
END