Announcement

Collapse
No announcement yet.

Update in for select do (Procedure)

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

  • Update in for select do (Procedure)

    Hallo Profis,<BR>
    ich bin am Verzweifeln. Ich habe eine Procedure mit folgender Schleife:<BR>
    <BR>
    for select h.historie_id, h.von_akisuser_id from historie h, hist_status hs <BR>
    where (h.hist_status_id=hs.hist_status_id) and ((h.perskonto_id = erskontoid)<BR> and (h.hist_grp_id=1) and
    (hs.erledigt='F'))<BR>
    into :historieid, :akisuserid<BR>
    do<BR>
    begin<BR>
    select mail from mitarbeiter where<BR>
    akisuser_id = :akisuserid<BR>
    into :mail_an;<BR>
    insert into mail<BR>
    (automail, m_an, m_thema, m_text, mailaccount_id)<BR>
    values<BR>
    ('T',:mail_an, 'Auskunft Creditreform', :mail_text, 1);<BR>
    select hist_status_id from hist_status<BR>
    where erledigt='T' into :histstatusid;<BR>
    if (:histstatusid is not null) then<BR>
    update historie set hist_status_id = :histstatusid<BR>
    where (historie_id=:historieid);<BR>
    end<BR>
    Das Update in der Tabelle Historie wird nicht ausgeführt, obwohl alle Werte
    vorhanden sind (Debugger von IBExpert)!<BR>
    Kann es sein, dass ich den aktuellen Datensatz aus "for select do" nicht updaten kann?<BR>
    Oder muss ich manuell den TransactionLevel setzen?<BR>

  • #2
    Hallo Frank,<br>

    <pre>Kann es sein, dass ich den aktuellen Datensatz aus "for select do" nicht updaten kann?</pre><br>
    Doch, kann man.<br>
    <pre>Oder muss ich manuell den TransactionLevel setzen?</pre><br>
    Nein, kannst Du in einer SP gar nicht, die läuft im Kontext der aufrufenden Transaktion.<br>
    <pre>update historie set hist_status_id = :histstatusid
    where (historie_id=:historieid);</pre><br>
    Du schreibst, dieses Update wird nicht ausgeführt. Kann es sein, dass es DOCH ausgeführt wird, aber entweder historie_id einen falschen Wert hat (oder NULL ist) und/oder histstausid genau den gleichen Wert hat wie vorher? (oder aber gleich einTrigger zuschlägt)?<br>
    Hast Du mal ein SELECT mit den Paraametrn des Update-Statements ausprobiert, um sicherzustellen, dass die Daten auch so vorhanden sind, wie Du es erwartest?<p>
    Ach ja: Und verwende besser explitzite JOIN-Syntax (SELECT FROM T1 [LEFT] JOIN T2 ON T1.FIOELD = T2.FIELD anstatt der veralteten Syntax über die WHERE-Clause.<p>
    Luc.<p>
    P.S.: Für Probleme mit Firebird gibt es auch einen netten deutschsprachigen Newsserver unter victory.equitania.de

    Comment


    • #3
      Hallo Lucas,<BR>
      ich bin mit dem Debugger von IBExpert bis an die Stelle und habe den Select mit genau den Daten ausgeführt.<BR>
      Danach stand der richtige Wert in der Datenbank.<BR>
      Das mit dem Where statt Join habe ich mir aus dem Buch von Andreas Kosch angeeignet.<BR>
      Er ist der Meinung, dass ein Plan, den ein Join ja erfordert, die Datenbank vor eine grössere Aufgabe stellt als die Variante mit Where.<BR>
      Unter der Bedingung, dass es immer einen Datensatz mit vordefinierter ID gibt und in der Linken Tabelle keine ID mit <null>!<BR>
      Aber ich werde es mal testen, denn schliesslich war bei Herausgabe des Buches ja noch Delphi 5 aktuell.<BR><BR>
      Ach ja, die Procedure wird durch eine After Insert - Trigger aufgerufen. Ich werde die Einstellung der Transaction im Quellcode noch mal prüfen.<BR>
      Auf jeden Fall erst mal vielen Dank für die schnelle Antwort!<BR>
      Fran

      Comment

      Working...
      X