Views und Stored Procedures

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Views und Stored Procedures

Beitrag von MacWomble »

Hallo,

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 :twisted: 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
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Views und Stored Procedures

Beitrag von af0815 »

Es hängt von deiner Planung ab. Wenn das sowieso nur für eine 'Serverfamilie' geschrieben ist und bleibt so ist es IMHO egal was du tust. Generell hentscheide ich mich immer für Thin oder Fat Client-Programmierung.

Thin-Client = die meiste Logik liegt am Server (Stored Procedures, Views)
Fat-Client = die Logik liegt im Client (Keine SP, wenige einfachere Views)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Views und Stored Procedures

Beitrag von MacWomble »

Ok, danke für die Antwort.

Ich habe heute einige Tests gemacht und mich entschieden, Views, UDP und UDF zu verwenden, da dies leichter wartbar und flexibler ist.
Einige Sachen habe ich bereit umgestellt und es läuft sehr gut. Der Quellcode des Programms wird um ein Vielfaches übersichtlicher.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten