Announcement

Collapse
No announcement yet.

UPDATE mittels CURSOR

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

  • UPDATE mittels CURSOR

    <body>
    Hallo,
    <br>folgendes Szenario: eine Tabelle, drei Spalten. Spalte 3 errechnet
    sich aus Spalte 1 und 2.
    <br>Die Berechnung erfolgt in einer Prozedur. Somit kann ich es nicht mittels
    einfachem UPDATE machen.
    <br>Also hab ich mir mal Cursor angeschaut. Es gibt da die Option FOR UPDATE
    OF &lt;column name>.
    <br>Mit dem folgenden Script sollte es funktionieren, nur: wo und vor allem
    wie &auml;ndere ich den Wert der Spalte c fuer jeden Datensatz!
    <blockquote>
    <pre><tt>DECLARE @fa FLOAT
    DECLARE @fb FLOAT
    DECLARE @fc FLOAT

    </tt></pre>
    <tt>DECLARE curTest CURSOR FOR</tt>
    <br><tt>&nbsp;&nbsp;&nbsp; SELECT a,b,c</tt>
    <br><tt>&nbsp;&nbsp;&nbsp; FROM tab_Test</tt>
    <br><tt>&nbsp;&nbsp;&nbsp; FOR UPDATE OF c</tt>
    <p><tt>OPEN curTest</tt>
    <p><tt>FETCH NEXT FROM curTest INTO @fa, @fb, @fc</tt>
    <p><tt>WHILE (@@FETCH_STATUS &lt;> -1)</tt>
    <br><tt>BEGIN</tt>
    <br><tt>&nbsp;/* hier soll bei dem Datensatz, auf den der Cursor zeigt,
    der Wert von c ge&auml;ndert werden !! */</tt>
    <p><tt>&nbsp;FETCH NEXT FROM curTest INTO @fa, @fb, @fc</tt>
    <br><tt>END</tt></blockquote>
    Mit einem UPDATE tab_Test SET c= @fc gehts, nur dann fehlt mir das Verstaendnis
    fuer FOR UPDATE beim CURSOR.
    <p>Ich hoffe, jemand kann mir helfen.
    <p>Gru&szlig; Thomas
    </body>

  • #2
    <body>
    Hallo,
    <p>hab die L&ouml;sung glaub ich selbst gefunden.
    <p>Mit
    <p><tt>&nbsp;&nbsp;&nbsp; <b>UPDATE tab_Test</b></tt>
    <br><b><tt>&nbsp;&nbsp;&nbsp; SET c= @fc</tt></b>
    <br><b><tt>&nbsp;&nbsp;&nbsp; WHERE CURRENT OF curTest</tt></b>
    <p>in der While-Schleife, vor dem FETCH NEXT, laeuft die Sache so, wie
    ich mir das vorstellte.
    <p>Gru&szlig;&nbsp; Thomas
    <br>&nbsp;
    <br>&nbsp;
    </body&gt

    Comment


    • #3
      Hallo,

      wenn der Einsatz eines Cursors in dieser Situation wirklich Sinn macht und eine eigene mit T-SQL geschriebene UDF die Aufgabe nicht effizienter erledigt, könnte man folgendes machen. Die Kombination von FOR UPDATE und WHERE CURRENT OF erlaubt das Updaten der aktuellen Zeile:
      <pre>
      DECLARE simpleCursor CURSOR
      LOCAL
      KEYSET
      FOR SELECT OilName, Description FROM Oils
      FOR UPDATE
      OPEN simpleCursor

      -- Fetch the first row
      FETCH simpleCursor

      -- Change the Description
      UPDATE Oils SET Description = 'This is a description'
      WHERE CURRENT OF simpleCursor

      Select OilName, Description FROM Oils
      WHERE OilName = 'Basil'

      CLOSE simpleCursor
      DEALLOCATE simpleCursor
      </pre&gt

      Comment


      • #4
        Hallo Thomas,
        Ich halte es immer für gut sich an die Regel zu halten berechnete Felder nie zu speichern!
        Gruß Gust

        Comment

        Working...
        X