Announcement

Collapse
No announcement yet.

Warum Stored Procedure?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Warum Stored Procedure?

    Hallo Gemeinde,

    mich würde interessieren, was den Vorteil einer SP ausmacht. Also nicht in Access sondern in einer SQL Datenbank. Soweit ich weiss, werden sämtliche Abfragen auf einer C/S Datenbank doch vom <B>Server</B> verarbeitet und nur das Ergebnis an den Client gesendet.

    Nichts anderes macht eine SP ja auch. Den einzigen Unterschied, den ich mir vorstellen kann, ist der, dass bei einem SQL Aufruf der ganze SQL String an den Server gesandt wird, bei einer SP nur die entsprechenden Parameter und halt die Aufforderung: führe die SP durch. Nur kann ich da keinen rechten Performancevorteil sehen (vielleicht im ms Bereich).

    Fragen tu ich das Ganze deswegen, weil ich mit MySQL arbeite und es dort ja keine SP, Trigger und Generatoren gibt.

    Viele Grüsse
    Uwe

  • #2
    Der wichtigste Grund ist, daß eventuelle Zwischenergebnisse nicht zum Client müssen.<br>
    Zudem kann man die Queries etwas kapseln, und muß bei Änderungen/Fixes nicht alle Clients updaten.<br>
    Richtig bemerkbar macht sich das allerdings erst bei großen Datenbanken (TableSpaces im GB/TB-Bereich) mit entsprechend komplexer Struktur.

    - nico

    ps: IMHO hat MySQL 4 Trigger und Stored Procedures

    Comment


    • #3
      Hi Nico,

      wenn ich es richtig verstehe, machen SP's nur bei richtig "dicken" Datenbanken Sinn. Das ist sehr schön, da ich, offen gestanden, auch meine Probleme in der Syntax von SP's habe (Erfahrungen mit IBase).

      Uw

      Comment


      • #4
        Zudem liegt eine SP geparst und optmiert auf dem Server, diese beiden Schritte sind am langsamsten bei der Ausführung von SQL. Man kann also Tempo machen

        Comment


        • #5
          Man kann mit SP's Aufgaben lösen, die mit SQL nicht zulösen wären und man deshalb gezwungen wäre die Daten zum Client zu holen

          Comment


          • #6
            Hallo Dietmar,

            welche Aufgaben wären das beispielsweise?

            Gruss
            Uw

            Comment


            • #7
              Hallo,<br><br>

              wenn ich mal kurz für Dietmar einspringen darf (alle Aussagen beziehen sich übrigens auf nur Interbase SP's):<br>
              1. Wenn man in einer Ergebnismenge einer Abfrage bestimmte Spalten nebeneinander haben möchte, die in der Tabelle aber untereinander stehen.<br><br>

              2. Wenn man in der Ergebnismenge einer Abfrage eine Spalte abhängig von einer Bedingung mit verschiedenen Werten gefüllt haben möchte.<br><br>

              3. Man kann in eine Stored Procedure einen Prüfalgorithmnus für ein Feld legen, und diese SP dann von verschiedenen Triggern aus aufrufen. Wenn sich die Prüflogik mal ändert, müssen nicht alle Trigger, sondern nur die SP geändert werden.<br><br>

              4. Wenn man nur eine begrenzte Anzahl von Datensätzen (z.B. die ersten 10) in der Ergebnismenge haben möchte (bei Interbase gibt's kein SELECT TOP...).<br><br>

              5. Wenn man komplexe Aufgaben in der DB immer wieder durchführt, und sämtliche Informationen dazu in der DB selbst enthalten sind, oder beim Aufruf per Parameter übergeben werden können.<br><br>

              Und, und, und...<br>
              Meine Meinung ist, alles was der SQL-Server alleine (ohne Kommunikation mit dem Client) kann, soll er auch alleine machen. Deshalb setze ich sehr oft SP's ein.<br><br>

              Gruß Dagma

              Comment


              • #8
                Hallo Dagmar,

                wow, vielen Dank für die wahrlich erschöpfende auskunft.

                Zwei Fragen habe ich noch:

                >>1. Wenn man in einer Ergebnismenge einer Abfrage bestimmte Spalten nebeneinander haben möchte, die in der Tabelle aber untereinander stehen.

                Das müsstest Du mir nochmal erläutern. Wie können Spalten untereinander stehen?

                >>4. Wenn man nur eine begrenzte Anzahl von Datensätzen (z.B. die ersten 10) in der Ergebnismenge haben möchte (bei Interbase gibt's kein SELECT TOP...).

                Wie macht man das?

                Nochmals herzlichen Dank!

                Viele Gruesse
                Uw

                Comment


                • #9
                  Hallo,<br><br>

                  zu 1.<br>
                  Ich meinte mit untereinander in verschiedenen Datensätzen.<br>
                  Z.B. Eine Tabelle hat die Spalten ID, JAHR, MONAT, WERT.<br>
                  Du möchtest eine Ergebnismenge haben, in der alle 12 Werte eines Jahres in einer Zeile stehen. Die SP könnte dann so aussehen:
                  <pre>
                  CREATE PROCEDURE SP_GETWERTE
                  RETURNS (
                  JAHR INTEGER,
                  WERT1 NUMERIC(15,2),
                  WERT2 NUMERIC(15,2),
                  WERT3 NUMERIC(15,2),
                  WERT4 NUMERIC(15,2),
                  WERT5 NUMERIC(15,2),
                  WERT6 NUMERIC(15,2),
                  WERT7 NUMERIC(15,2),
                  WERT8 NUMERIC(15,2),
                  WERT9 NUMERIC(15,2),
                  WERT10 NUMERIC(15,2),
                  WERT11 NUMERIC(15,2),
                  WERT12 NUMERIC(15,2))
                  AS
                  DECLARE VARIABLE WERT NUMERIC(15,2);
                  DECLARE VARIABLE MONAT INTEGER;
                  begin
                  /* Alle Werte auf 0 setzen */
                  WERT1 = 0;
                  WERT2 = 0;
                  WERT3 = 0;
                  WERT4 = 0;
                  WERT5 = 0;
                  WERT6 = 0;
                  WERT7 = 0;
                  WERT8 = 0;
                  WERT9 = 0;
                  WERT10 = 0;
                  WERT11 = 0;
                  WERT12 = 0;
                  /* Alle Werte einlesen */
                  FOR SELECT JAHR, MONAT, WERT FROM WERTE
                  ORDER BY JAHR, MONAT INTO :JAHR, :MONAT, :WERT
                  DO
                  BEGIN
                  IF (:MONAT = 1) THEN
                  WERT1 = WERT;
                  ELSE IF (:MONAT = 2) THEN
                  WERT2 = WERT;
                  ELSE IF (:MONAT = 3) THEN
                  WERT3 = WERT;
                  ELSE IF (:MONAT = 4) THEN
                  WERT4 = WERT;
                  ELSE IF (:MONAT = 5) THEN
                  WERT5 = WERT;
                  ELSE IF (:MONAT = 6) THEN
                  WERT6 = WERT;
                  ELSE IF (:MONAT = 7) THEN
                  WERT7 = WERT;
                  ELSE IF (:MONAT = 8) THEN
                  WERT8 = WERT;
                  ELSE IF (:MONAT = 9) THEN
                  WERT9 = WERT;
                  ELSE IF (:MONAT = 10) THEN
                  WERT10 = WERT;
                  ELSE IF (:MONAT = 11) THEN
                  WERT11 = WERT;
                  ELSE IF (:MONAT = 12) THEN
                  WERT12 = WERT;
                  /* Wenn alle Monate gefüllt, dann ausgeben */
                  IF (:MONAT = 12) THEN
                  BEGIN
                  suspend;
                  /* Und die Werte erst mal wieder leer machen */
                  WERT1 = 0;
                  WERT2 = 0;
                  WERT3 = 0;
                  WERT4 = 0;
                  WERT5 = 0;
                  WERT6 = 0;
                  WERT7 = 0;
                  WERT8 = 0;
                  WERT9 = 0;
                  WERT10 = 0;
                  WERT11 = 0;
                  WERT12 = 0;
                  END
                  END
                  end
                  </pre>
                  Zu 2.<br>
                  Wenn ich im o.g. Beispiel nur 3 Jahre haben möchte, dann kommt noch ein Zähler mit rein, der bei jedem SUSPEND um eins erhöht wird. Wenn die maximale Anzahl erreicht ist, kann man die SP ja mit EXIT verlassen.<br><br>
                  Gruß Dagma

                  Comment

                  Working...
                  X