Announcement

Collapse
No announcement yet.

StoredProcedure, Rekursiv, Cursor

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

  • StoredProcedure, Rekursiv, Cursor

    Hallo,<p>
    <br>
    ich verwende MSSQL2000 und moechte mit Hilfe einer StoredProcedure ein Problem rekursiv loesen.<br>
    Dabei verwende ich in dieser Procedure "procBestimmeMenge (Artikel, Datum)" einen Cursor.<br>
    Bei einer Bedingung z.B.<br>
    wenn 31.12.<br>
    rufe nochmals "procBestimmeMenge (Artikel, NeuDatum)" auf<br>
    <br>
    Dabei bekomme ich nachfolgende Fehlermeldung,<br>
    wenn ich die StoredProc mit SQLQueryAnalyser per Einzelschritt durchgehe
    und die Zeile<br>
    OPEN crArtikelInfo<br>
    aufrufe<br>
    Server: Nachr.-Nr. 16915, Schweregrad 16, Status 1, Prozedur procBestimmeMenge, Zeile 131<br>
    [Microsoft][ODBC SQL Server Driver][SQL Server]Ein Cursor mit dem Namen 'crArtikelInfo' ist bereits vorhanden.<br>
    <br>
    Wer weiss Rat<br>
    <br>
    Gruss und Dank<br>
    Dietmar

  • #2
    Hallo Dietmar,

    die Fehlermeldung spricht doch für sich. Der Cursor wird beim ersten Durchlauf der SP initialisiert. Beim rekursiven Durchlauf wird das erneut versucht, deshalb die Meldung.

    Ich hab das Problem mit 2 SP gelöst. Die 1. rufts du auf, in der alles initialisiert wird. Anschliessend aus der 1 raus die rekursive SP. Zum Schluss wieder den CURSOR freigeben und fertig. Geht sicherlich noch geschickter, hat bei mir aber geklappt.

    Gruss,
    Tom Peiffe

    Comment


    • #3
      Hallo Tom,<br>
      <br>
      Danke fuer die schnelle Antwort.<br>
      Mir war schon klar dass der Cursor noch irgendwo (Arbeitsspeicher oder tempdb) existiert, wusste aber nicht wo und wie umgehen ...<br>
      Als ich Deinen 2ten Absatz gelesen hatte ging mir ein Licht auf. Jedoch hatte ich noch das Problem, dass in meiner "rekursive SP" ein neuer Cursor selelktiert werden muss.<br>
      D.h., dass ich beim Aufruf von "procBestimmeMenge (@Artikel, @NeuDatum)" mit dem neuen Datum auch einen neuen "SELECT" benoetige.<br>
      Mit einer Cursor-Ubergabe "procBestimmeMenge (@Artikel, @NeuDatum, @cCursor)" und der Funktion CURSOR_STATUS('variable', '@cCursor') hatte ich auch wenig Erfolg.<br>
      Erst nachdem ich statt einem&nbsp;<br>
      <b><font face="Courier New" size="1">&nbsp;&nbsp; DECLARE cArtikelInfoCursor CURSOR FOR SELECT * FROM ArtikelInfo
      WHERE ArtikelInfo.Datum = @NeuDatum<br>
      &nbsp;&nbsp; OPEN cArtikelInfoCursor</font></b>&nbsp;<br>
      eine Cursor-Variable verwendet habe<br>
      <b><font face="Courier New" size="1">
      &nbsp;&nbsp; DECLARE @cArtikelInfoCursor CURSOR<br>
      &nbsp;&nbsp; SET @cArtikelInfoCursor = CURSOR LOCAL FOR SELECT * FROM
      ArtikelInfo WHERE ArtikelInfo.Datum = @NeuDatum<br>
      &nbsp;&nbsp; SET @nCursorStatus = CURSOR_STATUS ('variable', '@cArtikelInfoCursor
      ')<br>
      &nbsp;&nbsp; IF @nCursorStatus &lt;= 0<br>
      &nbsp;&nbsp; BEGIN<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPEN @cArtikelInfoCursor&nbsp;<br>
      &nbsp;&nbsp; END</font></b><br>
      funktionierte es so, wie es auch sein sollte. Wichtig ist eine Cursor-Variable
      zu verwenden und den Cursor mit LOCAL öffnen ..<br>
      Der Fetch und der andere Rest ist wie gehabt.<br>
      <br>
      Gruesse<br>
      &nbsp;&nbsp; Dietmar
      &#10

      Comment

      Working...
      X