Announcement

Collapse
No announcement yet.

SQL error code = -804 beim nten Aufruf der stored procedure

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

  • SQL error code = -804 beim nten Aufruf der stored procedure

    Hallo,

    ich habe folgende Fehlersituation:

    ************************************************** ********************************************<br>
    Dynamic SQL Error<br>
    SQL error code = -804<br>
    SQLDA missing or incorrect version, or incorrect number/type of variables<br>
    ************************************************** ********************************************<br>

    ************************************************** ********************************************<br>
    Auf dem Server läuft hierbei folgende stored procedure ab:<br>
    <br>
    CREATE PROCEDURE CREATENEWWORD (<br>
    INWORD VARCHAR(200),<br>
    INWORDTYPE INTEGER<br>
    ) RETURNS (<br>
    OUTWORDID INTEGER,<br>
    OUTWORDTYPE INTEGER<br>
    ) AS <br>
    DECLARE VARIABLE ilID INTEGER;<br>
    DECLARE VARIABLE ilWordType INTEGER;<br>
    BEGIN<br>
    SELECT ID, WORDTYPE FROM WORD WHERE TEXT = :inWord INTO :ilID, :ilWORDTYPE;<br>
    IF (:ilID IS NULL) THEN<br>
    BEGIN<br>
    ilID = gen_id( genid, 1 );<br>
    INSERT INTO WORD (ID,TEXT,WORDTYPE) VALUES (:ilID, :inWord, :inWordType);<br>
    outWordID = ilID;<br>
    outWordType = inWordType; <br>
    END<br>
    ELSE<br>
    BEGIN<br>
    IF ( inWordType = 0 AND ilWordType <> 0 ) THEN<br>
    BEGIN<br>
    UPDATE WORD SET TEXT = :inWord WHERE ID = :ilID;<br>
    outWordType = ilWordType; <br>
    END ELSE<br>
    BEGIN<br>
    UPDATE WORD SET WORDTYPE = :inWordType, TEXT = :inWord WHERE ID = :ilID;<br>
    outWordType = inWordType; <br>
    END<br>
    outWordID = ilID;<br>
    END<br>
    END<br>
    ************************************************** ********************************************<br>
    Der Fehler tritt beim Aufruf der Methode spCreateWord.Excute auf:<br>

    procedure TNoamDMDocument.saveDocumentWord( ThreadId : Integer; Document : TNoamDocument );<br>
    var<br>
    Counter : TNoamCounter;<br>
    i : Integer;<br>
    cParams : TParams;<br>
    begin<br>
    try<br>
    cParams := TParams.Create;<br>
    cParams.Assign( spCreateWord.Params );<br>
    for i := 0 to Document.Words.Count - 1 do<br>
    begin<br>
    ThreadForm.progressThreadMessage( ThreadId, 0, Document.Words.Count, i );<br>
    Counter := TNoamCounter( Document.Words.Items[i] );<br>
    if Length( Counter.Word.Text ) > 0 then<br>
    begin<br>
    spCreateWord.Params.ParamByName( 'inWORD' ).Value := Counter.Word.Text;<br>
    spCreateWord.Params.ParamByName( 'inWORDTYPE' ).Value := Counter.Word.WordType;<br>
    <br>
    spCreateWord.Execute;<br>
    <br>
    Counter.Word.Id := spCreateWord.Params.ParamByName('OUTWORDID').Value ;<br>
    Counter.Word.WordType := spCreateWord.Params.ParamByName('OUTWORDTYPE').Val ue;<br>
    <br>
    spCreateWord.Params.Clear;<br>
    spCreateWord.Params.Assign( cParams );<br>
    <br>
    spCreateDocumentWord.Params.ParamByName( 'inDocument' ).AsInteger := Document.Id;<br>
    spCreateDocumentWord.Params.ParamByName( 'inWord' ).AsInteger := Counter.Word.Id;<br>
    spCreateDocumentWord.Params.ParamByName( 'inCounter' ).AsInteger := Counter.Counter;<br>
    spCreateDocumentWord.Execute;<br>
    <br>
    saveWordLeftNeighbour( ThreadId, Counter.Word );<br>
    saveWordContext( ThreadId, Counter.Word );<br>
    end;<br>
    end;<br>
    except<br>
    on e : Exception do MessageDlg( e.Message, mtError, [mbOK], 0 );<br>
    end;<br>
    end;<br>
    ************************************************** ********************************************<br>
    <br>
    Das merkwürdige ist, dass die procedure mehrmals fehlerfrei durchlaufen wird. In der Regel ca. 10x. Komisch ist auch, dass der Fehler nicht von irgendwelchen übergebenen Daten abhängig ist. Läuft die Anwendung innerhalb des Delphi-Debuggers,

  • #2
    Ich habe die Komponente getauscht. D.h. ich rufe die Procedure auf dem Server nicht mehr über eine TIBStoredProc sondern über eine TISQL-Komponente auf. Läuft jetzt einwandfrei.<br>
    Es würde mich trotzdem interessieren warum die Procedure nicht korrekt läuft.<br&gt

    Comment


    • #3
      Hallo Frank,<br>
      dies ist ein Bug, der seit Jahren in Interbase drinnen ist und leider noch nicht ausgemerzt wurde. Dabei handelt es sich immer um Remote-Verbindungen (bei Dir auch?). Die gute Nachricht ist, daß Karsten Strobel nun vermutlich die Ursache im Source-Code gefunden haben könnte und Borland dies nun hoffentlich aufgreift, um diesen Fehler in der nächsten Interbase Version (6.5) zu beseitigen. Vielleicht weiß Karsten bereits mehr.<br><br>
      Bei der Verwendung einer TIBStoredProc sollte diese immer vor der Verwendung "Unprepared" werden, dann die Parameter zuweisen, ein Prepare durchführen und anschließend ein Open (falls es sich hierbei um eine Stored Procedure handelt, die eine Ergebnismenge zurückliefert) od. Execute (im Falle von DML-Statements). Bei Stored Procedures, die eine Ergebnismenge zurückliefern MUSS ein SUSPEND am Ende der Stored Procedure eingebaut werden.<br><br>
      Thomas Steinmaure
      Thomas Steinmaurer

      Firebird Foundation Committee Member
      Upscene Productions - Database Tools for Developers
      Mein Blog

      Comment


      • #4
        Hallo Thomas,<br>
        danke für die Antwort, ich hatte schon an mir gezweifelt.<br>
        <br>
        Ist es üblich, dass die Stored Procedure nach dem Execute die Parameter verliert?<br>
        <br>
        Frank Lin

        Comment


        • #5
          Hallo Frank,
          wie Thomas schon sagte: Dieser Fehler ist bekannt. Nähere Infos findest Du unter: www.interbase2000.de (siehe unter "Projekte").

          Deine Frage: "Ist es üblich, dass die Stored Procedure nach dem Execute die Parameter verliert?" verstehe ich leider nicht.

          Gruss
          Karsten Strobe

          Comment


          • #6
            @Frank

            wenn dein Statement mit dem Du die Procedure aufrufts nicht mehr prepared ist, dann kommtst Du nicht an die parameter dran, daher

            <pre>
            asql.prepare;
            asql.ParamByName('A').AsInteger := 1;
            asql.open;
            b := asql.FieldByName('B').AsInteger;
            asql.close;
            c := asql.ParamByName('C').AsInteger;
            asql.unprepare;
            </pre>

            Ohne explizietes prepare macht open und close das mit und das ist dann das problem, inbesondere auch wenn dies bei ExecSQL implizit mitgeschiet

            Comment

            Working...
            X