Announcement

Collapse
No announcement yet.

select in SPs funzt nicht

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

  • select in SPs funzt nicht

    Bin am verzweifeln, wer hat einen Tip? Arbeite schon länger mit FB1.5 und habe jede Menge stored procedures mit select Abfragen. Bis vor 3 Tagen hat alles funktioniert, aber neuerdings liefern diese Abfragen kein Ergebnis
    Beispiel:
    select hoch, tief, schrlix, schrliy, schrrex, schrrey, schschx, schschy from LHT where ID = id into :LHThoch, :LHTtief, :LHTschrlix, :LHTschrliy, :LHTschrrex, :LHTschrrey, :LHTschschx, :LHTschschy;

    Das teste ich dem SP-Debugger von EMS-IB/FB-Manager. Aber auch ein Aufruf der SP unter Delphi6 liefert kein Ergebnis. Und exakt ein Datensatz ist in der Tabelle LHT für den übergebenen Parameter id !

    Ersetze ich die einfache select-Abfrage mit for select ... do, dann liefert die SP nach der Abfrage ein Ergebnis.

    An der security.fdb kanns auch nicht liegen, denn als embedded FB hab ich den selben Fehler.

    Möchte nicht 50 SPs umschreiben. Bin für jeden Ansatz dankbar. Friedhelm

  • #2
    Hallo Friedhelm,<p>
    1. Die security.fdb kann NIE etwas mit SPs zu tun haben, die ist lediglich für die Benutzerverwaltung zuständig<br><br>
    2. Vertraue nie dem Output eines Debuggers sei es EMS oder IBExpert oder DBWorkbench oder .... Alle Debugger arbeiten mit internen Umsetzungen und die können fehlschlagen (eigene Erfahrung)<br><br>
    3. Ist es eine SELECTABLE oder EXECUTABLE procedure, d.h. arbeitest Du in der SP mit SUSPEND oder nicht?<br>
    Bei SELECTABLE procedures musst Du mit SELECT * FROM SP... abfragen, bei EXECUTABLE musst Du die Prozedur mit EXECUTE PROCEDURE SP... ausführen.<br>
    Je nach verwendeten Zugriffskomponenten hast Du die Ergebnisse dann im Fields- bzw. Params-Array<br><br>
    4. Wie sieht die Rückgabe aus wenn Du das SELECT aus der Procedure direkt über eine Query ausführst? Sind die Daten dann da?<br> <br>
    5. Bist Du sicher, dass Deine DB in Ordnung ist und keinerlei corruption aufweist?<br> Hast Du mal ein Backup/Restore versucht?<br>Datenbanken programmieren sich äußerst selten eigenständig neu ;-)<br><br>
    6. Wenn das alles nix hilft: Wie sieht denn der Sourcecode für die SP aus?<br>
    <p>
    Luc

    Comment


    • #3
      hallo Luc,

      danke für schnelle Antwort.

      Zu 3: Ich arbeite ohne SUSPEND. Die SP ist einfach dazu da, mir nach bestimmten Gegebenheiten weitere Tabellen zu aktualisieren.

      Aufruf in Delphi:
      <PRE>
      with SPalles do
      begin
      SPalles.StoredProcName := 'SP_FRONT_WAHL';
      if not prepared then prepare;
      paramByName('pID').asInteger := TMASSKid.Value;
      paramByName('pMassli').asInteger := TMASSKmassli.Value;
      execproc;
      unprepare;
      end;
      </PRE>

      Aufbau der SP in Firebird:
      <PRE>
      CREATE PROCEDURE SP_FRONT_WAHL (
      PID SMALLINT,
      PMASSLI SMALLINT)
      AS
      declare variable LHTlang smallint;
      declare variable LHThoch smallint;
      declare variable LHTtief smallint;
      declare variable LHTschrlix smallint;
      declare variable LHTschrliy smallint;
      declare variable LHTschrrex smallint;
      declare variable LHTschrrey smallint;
      declare variable LHTschschx smallint;
      declare variable LHTschschy smallint;
      declare variable MASSKmassnr smallint;
      declare variable MASSKmassbreite smallint;
      declare variable MASSKmasstiefe smallint;
      declare variable MASSKmasshoehe smallint;
      declare variable a smallint;
      BEGIN
      select hoch, tief, schrlix, schrliy, schrrex, schrrey, schschx, schschy
      from LHT where ID = id into :LHThoch, :LHTtief, :LHTschrlix,
      :LHTschrliy, :LHTschrrex, :LHTschrrey, :LHTschschx, :LHTschschy;
      for select MASSNR, MASSBREITE, MASSTIEFE, MASSHOEHE from MASSK
      where ID = Id and MASSLI = Massli into
      :MASSKmassnr, :MASSKmassbreite, :MASSKmasstiefe, :MASSKmasshoehe do
      a = 1;
      ...
      nach bestimmten Berechnungen werden Werte in anderen Tabellen gespeichert ....
      END
      </PRE>

      Sowohl die select als auch die for select Anweisungen müßten einen (nur einen ) Datensatz liefern, aber nur for select schafft das. Bei einer normalen Abfrage außerhalb der SP kommen die Werte wie gewünscht.

      Die letzten Tage hab ich nichts anderes gemacht, als die DB zu entladen als SQL-Code und dann wieder herzustellen. Und im SQL-Code hab ich keine Schweinereien entdeckt.

      Friedhel

      Comment


      • #4
        Hallo Friedhelm<p>
        Ich sehe nichts allzu Besonderes ausser:<br>
        - in Delphi weist du die SP dynamisch zu, führst sie aus, machst aber keinerlei COMMIT<br>
        - hast Du das gleiche Verhalten wenn Du statt einer dynamischen eine fixe Zuweisung zu einer (ja was für einer eigentlich?) Komponente verwendest?
        <p>
        Luc

        Comment


        • #5
          Ich denke es werden noch Rückgabeparameter gebraucht und ein suspend um eine Datensatz zu erhalten. Aber wenn Du sagst, dass in der procedure etwas ausgeführt wird, wofür wird eine Ausgabe im Programm benötigt?
          <PRE>
          CREATE PROCEDURE SP_FRONT_WAHL (
          PID SMALLINT,
          PMASSLI SMALLINT)
          returns
          (Wert1 smallint,
          Wert2 smallint, ....)
          AS
          declare variable LHTlang smallint;
          declare variable LHThoch smallint;
          ......
          </PRE>
          Gruß Andrea

          Comment


          • #6
            Diese Diskussion bringt mich nicht weiter. Ich vermute, in der Datenbank ist (wieso auch immer) eine Einstellung falsch. Meine SP ist mit Sicherheit richtig formuliert, hab schon viele 1000 Zeilen SPs ohne Probleme geschrieben. Und bis Sonntag hats ja funktioniert.

            Damit ich weiter komme: Gibts einen Experten, dem ich die DB schicken kann? Das kann auch eine Firma sein, die mir eine Rechnung schickt. Kontakt unter fg at sch-holz.de

            Friedhel

            Comment

            Working...
            X