Announcement

Collapse
No announcement yet.

Stored Procedure

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

  • Stored Procedure

    Hallo Leute,
    ich arbeite zwar schon ein paar Wochen mit MySQL. Ich komme eigentlich aus der FireBird Szenen und da sind Stored Procedured total easy.
    Nun möchte ich sie hier auch versuchen. Aber nur Probleme.
    Ich habe mir die Spracheigenschaften angeschaut und verinnerlicht. Klappt auch ganz gut. Nun will ich aber ein Multiergebnis bekommen, wie bei einem Select.
    Ich bekomme aber,(MysqlWorkbench) mehrere Register, anstatt Resultset. Auch ein Testprojeht mir c# zeigt mir das selbe Pfänomen. In dem Grid wird immer nur die letzte Zeile gezeigt.
    Zuletzt editiert von Tossi65; 25.04.2012, 13:30.
    Danke Torsten

  • #2
    Hallo,

    ich versteh dein Problem nicht ganz und ohne ein Stückchen Beispielcode kann ich nur raten...

    Aber eigentlich geht sowas:
    Code:
    mysql> DELIMITER |
    mysql> create procedure test()
        -> begin
        ->   select 1
        ->   union
        ->   select 2
        ->   union
        ->   select 3;
        -> end
        -> |
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DELIMITER ;
    mysql> call test();
    +---+
    | 1 |
    +---+
    | 1 |
    | 2 |
    | 3 |
    +---+
    3 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk, danke für Deine schnelle Antwort.

      Also folgendes. Ich habe eine Procedure Test:

      Beispiel:
      ...
      create procedure test()
      begin
      SELECT * FROM TABELLE;
      end...

      cal test();
      Ergebnis:
      Spalte
      Wert1
      Wert2
      Wert3
      Wertn


      Nun andere variante:
      Beispiel:
      ...
      create procedure test(out A Wert integer)
      begin
      cursor SELECT * FROM TABELLE;
      ...
      open cursor;
      fetch corsour into wert;
      while not fertig
      if Wert = 1 then
      set Wert =1;


      select wert;
      end while

      ...
      end...

      call test(@Wert)

      Ergebnis1:
      Spalte
      Wert1

      Ergebnis2:
      Spalte
      Wert2

      Ergebnis3:
      Spalte
      Wert3

      Ergebnisn:
      Spalte
      Wertn

      Ziel soll es sein, dass ich während des durchlaufes des Cursors, auf bestimmte Werte, in den Variablen reagieren kann und dies dann verändert zurückgeben kann.
      Das geht auch soweit
      Aber ich bekomme immer nur die letzte Zeile der Results zurück oder aber pro Result einen Ergebbnistab in der Workbench. Ich hätte aber den Result genauso zurück, wie bei einem Select Statement.

      In FireBird wäre das in etwa so:

      ...
      for select etwas von Tabelle do
      begin
      mach was;
      suspend;
      end
      ...

      So erhalte ich ein Ergebnis das auch Zeilenweise ist.


      Ich hoffe es besser erlärt zu haben.
      Danke Torsten

      Comment


      • #4
        Hallo,

        du kannst kein Resultset aus irgendwelchen Werten "zusammenbauen". Ein Resultset kann nur aus einem Select kommen. Dein Select liefert pro Schleifendurchlauf immer nur eine Zeile!

        Für das was du willst, sehe ich nur die Möglichkeit die kalkulierten Werte innerhalb der Schleife in eine temp. Tabelle zu schreiben und am Ende ein Select auf diese Tabelle zu machen.

        [highlight=sql]
        create procedure test(out A Wert integer)
        begin
        cursor SELECT * FROM TABELLE;
        ...
        open cursor;
        fetch corsour into wert;
        while not fertig
        if Wert = 1 then
        insert into <temptable> (...) values (...);
        ...
        end while

        ...
        select ... from <temptable>;
        end...
        [/highlight]

        Gruß Falk

        P.S.: Formatierung von SQL in Beiträgen
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo
          und Entschuldigung für die falsche Formatierung.

          Sollte Mysql wirklich so unflexibel sein? In FireBird ist das Möglich. Und die Krücke mit der temporären Tabelle ist für uns indiskutabel, da wir eine Cluster Datenbank anwenden und Tabellen nicht gelöscht werden können, laut Mysql Doku. Also "back to the roots" und alle Daten über die Leitung holen und dann in der Anwendung zusammenbauen.

          Danke für die Hilfe
          T.Schumann
          Danke Torsten

          Comment


          • #6
            Originally posted by Tossi65 View Post
            ...Sollte Mysql wirklich so unflexibel sein? ... Und die Krücke mit der temporären Tabelle ist für uns indiskutabel, ...
            Soviel zu unflexibel... Die Lösung mit "alle Daten über die Leitung holen und dann in der Anwendung zusammenbauen." ist dann wohl besser?

            Was spricht gegen eine temporäre Tabelle, erzeugt mit CREATE TEMPORARY TABLE:
            Originally posted by http://dev.mysql.com/doc/refman/5.0/en/create-table.html
            You can use the TEMPORARY keyword when creating a table. A TEMPORARY table is visible only to the current connection, and is dropped automatically when the connection is closed. This means that two different connections can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY table of the same name. (The existing table is hidden until the temporary table is dropped.) To create temporary tables, you must have the CREATE TEMPORARY TABLES privilege.
            Zusammen mit der MEMORY (HEAP) Storage Engine?

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Ok danke Falk,
              war ein wenig vorlaut. Aber damit muss ich mich erst einmal befassen. Aber wir arbeiten mit einem Echtzeitsystem und Zeit haben wir selten.

              Ich danke für die Hilfe.
              Danke Torsten

              Comment


              • #8
                Ohne mich jetzt genau mit dem eigentlich Problem befasst zu haben - ein paar allgemeine Gedanken dazu;

                Wesshalb beharrt ihr auf der prozeduralen Lösung? Gerade wenn Performance ein Kriterium ist - würde ich das Datenbankmodell entsprechend auslegen damit die Daten aus Sicht der DB möglichst einfach abgefragt resp abgefüllt werden können. Beim aufgezeigten Beispiel ist es z.B. praktisch unmöglich einen allfälligen Index effizient anzuwenden.

                Comment

                Working...
                X