Views und Stored Procedures

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.

Views und Stored Procedures

Beitragvon MacWomble » 15. Nov 2018, 08:15 Views und Stored Procedures

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 15. Nov 2018, 17:09 Re: Views und Stored Procedures

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).
af0815
 
Beiträge: 3497
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 15. Nov 2018, 23:35 Re: Views und Stored Procedures

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

• Themenende •

Zurück zu Datenbanken



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried