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
 der Abfrage (Das war bisher in der Unit definiert!):
  der Abfrage (Das war bisher in der Unit definiert!):
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
 Verein
Verein 
 Links
Links Suche
Suche