Announcement

Collapse
No announcement yet.

Stored Proc : Invalid request BLR

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

  • Stored Proc : Invalid request BLR

    In eine Adrsstabelle füge ich einenDatensatz ohne trigger ein, da die Tabelle auch differenzierte Stammdaten aus anderen Tabellen eingefügt bekommt. Dazu habe ich zum einfügen einen neuen Datensatzes folgendes geschrieben :<br>
    Create Procedure InsertKundenAdresse<br>
    (<br>
    Ar integer,<br>
    an varchar(50),<br>
    vor varchar(50),<br>
    nach varchar(50),<br>
    zu varchar(50),<br>
    zh varchar(50),<br>
    post integer,<br>
    stra varchar(50),<br>
    l varchar(3),<br>
    pl varchar(10),<br>
    ort varchar(50)<br>
    )<br>
    returns<br>
    (<br>
    kd integer<br>
    )<br>
    as<br>
    begin<br>
    select max(kdnummer) + 1 from Kunden into kd;<br>

    insert <br>
    into adressen<br>(kdnummer,art,anrede,vorname,nachname, zusatz,zhd,postfach,strasse,land,plz,ort)<br>
    values<br>
    (<br>
    :kd, :ar, :an, :vor, :nach, :zu, :zh, ost, :stra, :l, l, rt<br>
    );<br>

    suspend;<br>
    end;<br>

    Beim Anlegen der Procedure erscheint : <br>
    Invalid request BLR at offset 367 bad paramter number.<br>
    Kennt jemand diese Fehlermeldung ?

  • #2
    Ich habe Deine Prozedur mal ausprobiert und hatte damit kein Problem. Das einzige, was mir auffaellt, ist das Dein "select max(kdnummer) + 1 from Kunden into kd;" bei einer leeren Tabelle kunden als Ergebnis NULL zurueckgeben wird. Aber das ist kein Grund für die "Invalid request BLR .." Meldung, die Du bekommst.

    Gruss

    K

    Comment


    • #3
      Ein Hinweis dazu :<br>
      Da das Projekt sehr gross wird und mehrere Jahre schon läuft habe ich alle SQL-texte, Tabellenerstellungen, Trigger und Proceduren in einer DBAse-tabelle (Art,Beschreibung,Memo) zusammengefasst, so das ich bei korrekturen die ganze Datenbank zusammenclicken kann.<br>
      Zur Erstellung einer Procedure schreibe ich sie in ein DBMemofeld, übergebe die Strings an ein IBQuery und schicke sie mit comitretaining ab. Das funktionierte bisher einwandfrei

      Comment


      • #4
        Tja, was soll man sagen... Klingt genial. Vielleicht extrahierst Du einfach mal ein Script aus einer von Dir generierten Datenbank und überprüfst, ob da auch wirklich das drin ist was Du erwartest.

        Gruss

        K

        Comment


        • #5
          Gibt es Konventionen, wenn ich Stored-Proceduren über IBQuery speichere ? Dies ist meine einzige, in der mehr wie ein Befehl eingesetzt ist. Fehler mit Doppelpunkten oder Semikolon möglich ?

          Gruss G

          Comment


          • #6
            Gute Frage. Solange die IBQuery-Komponente nicht auf die Idee kommt "mitzudenken", sollte es mit einer einzelnen SP-Definition (CREATE PROCEDURE .. BEGIN .. END) kein Problem geben. Zwischen BEGIN und END können ja das Standardterminatorzeichen ( vorkommen, aber dennoch ist die ganze Anweisung als einzelner Befehl aufzufassen. Ich würde hinter dem letzten END kein ; mehr setzen. Wenn es bei anderen Prozeduren funktioniert, warum dann nicht auch bei dieser..?
            Ach ja, noch eine Idee: Die IBQuery-Komponente könnte der Ansicht sein, die in der SP mit einem Doppelpunkt eingeleiteten Parameter (z.B. :kd usw.) als Parameter der Anweisung zu behandeln und bei Senden an den Server durch ein "?" zu ersetzen. Das würde die Sache vielleicht erklären. Evtl. hilft es hier schon, die Eigenschaft ParamCheck auf False zu setzen. Ansonsten würde ich es mal mit dem SQL-Monitor versuchen.

            Gruss

            Karsten Strobe

            Comment


            • #7
              Gute Idee,

              in der IBConsole wird bei den Metadateien ein ? angezeigt. Ist das ein Fehler über PArametercheck ?

              Gruß G

              Comment


              • #8
                Ja. Das Problem ist wahrscheinlich folgendes:
                Normalerweise verwendet man TIBQuery für parametrierbare Abfragen, z.B. "SELECT * FROM kunden where kdnummer = :kd". So eine Abfrage wird von der Komponente geparst. Die Komponente findet die Parameter, die mit einem Doppelpunkt eingeleitet werden, hier also "kd". An den InterBase-Server werden die Parameter als "?" weitergegen. Aktuelle Parameter setzt man z.B. mit "IBQuery.ParamByName('kd').AsInteger := 1". Der aktuelle Parameterwert (hier: 1) wird zusätzlich zu der eigentlichen Abfrage an der Server geschickt und von diesem für das "?" verwendet.
                Beim Erzeugen einer Stored Procedure darf das natürlich so nicht passieren. Da muss nämlich der unveränderte Quellcode, mit allen Doppelpunkten und was sonst noch dazugehört, an den Server geschickt werden. Die IBQuery-Komponente darf hier nicht einfach ein "?" für alle vermeintlichen (mit Doppelpunkt eingeleiteten) Parameter einsetzen. Das würde zu Problemen führen, wie man in Deinem Fall ja sieht.
                Die Eigenschaft "IBQuery.ParamCheck := false" sollte dieses Verhalten (nämlich das Parsen des SQL-Texts und Ersetzen der :Params durch ?'s) unterbinden. D.h.: Erst "IBQuery.ParamCheck := false" setzen, dann "IBQuery.SQL.Text := create-procedure-code" setzen und dann abschicken. Da ich IBX (womit Du - glaube ich - arbeitest) nicht so genau kenne, bin ich mir nicht sicher, ob das die Lösung ist. Wenn immer noch ?'s im Metacode auftauchen, dann war's nicht die Lösung.

                Gruss

                Karsten Strobe

                Comment


                • #9
                  Das wars auch, danke.
                  Ich hatte zuerst auf IBSQL gewechselt, auch ohne Erfolg. Jedoch der ParamCheck-Schalter war es.<br>
                  Gibt es einen Lehrgang darüber, wie man solche Sachen findet ?<br>
                  Gerade diese Kleinigkeiten halten mich die meiste Zeit auf.<br>
                  Sind die IBObjects besser,logischer oder einfacher ?<br>
                  Gruss GForste

                  Comment


                  • #10
                    Es gibt natürlich Schulungen (ich persönlich führe auch projekt- und firmenindividuellen Trainings durch) aber natürlich ersetzt nichts die praktische Erfahrung.

                    IBObjects sind meiner persönlichen Meinung nach gegenüber IBX deutlich überlegen. Besser? Ja. Logischer? Naja, IBX ist nicht gerade unlogisch. Einfacher? Nein. Interessanter Link zu diesem Thema: http://www.ibobjects.com/ibo_or_ibx.html

                    Gruss

                    Karsten Strobe

                    Comment

                    Working...
                    X