Datenbank: Interbase • Version: 5 • Zugriff über: TIB_Cursor
Anweisung vor "FOR SELECT" Block
Hallo zusammen,
ich habe folgendes Problem: ich möchte per SQL Befehl über die IB_Cursor-Komponente eine Prozedur in der Datenbank verändern. Dazu verwende ich das folgende Code-Konstrukt:
SQL-Code:
Das merkwürdige ist nun, dass genau dieses Statement beim Ausführen im Interbase-Client ohne Fehlermeldung funktioniert. In Delphi hingegen wird nach dem Aufruf von
ALTER PROCEDURE Test (Index CHAR(10))
RETURNS ( Wert1 FLOAT, WERT2 FLOAT, Diff FLOAT ) AS BEGIN IF (:Index = "") THEN SELECT anderenWert FROM Tabelle INTO :Index; (*) FOR SELECT A, B FROM Tabelle2 WHERE (Tabelle2.Index = :Index) INTO :Wert1, :Wert2 DO BEGIN Diff=- :Wert1 - :Wert2; END END
Delphi-Quellcode:
eine Exception geworfen.
IB_Query.SQL.Text := ...;
IB_Query.prepare(); Die Ursache hierfür muss in der Codezeile (*) liegen, da der Fehler ohne diese Abfrage nicht auftritt. Allerdings weiß ich nicht, wie ich dieses Problem umgehen kann. Meine Vermutung ist, dass es sich um ein Problem mit dem Trennzeichen ";" handelt. Im Voraus bereits vielen Dank Schöne Grüße Jochen |
Re: Anweisung vor "FOR SELECT" Block
Hi Jochen,
du musst das folgendermaßen machen:
SQL-Code:
MfG
SET TERM ^ ;
ALTER PROCEDURE Test (Index CHAR(10)) RETURNS ( Wert1 FLOAT, WERT2 FLOAT, Diff FLOAT ) AS BEGIN IF (:Index = "") THEN SELECT anderenWert FROM Tabelle INTO :Index; FOR SELECT A, B FROM Tabelle2 WHERE (Tabelle2.Index = :Index) INTO :Wert1, :Wert2 DO BEGIN Diff=- :Wert1 - :Wert2; END END ^ SET TERM ; ^ Stevie P.S.: Willkommen in der DP! |
Re: Anweisung vor "FOR SELECT" Block
Hallo Stevie,
danke für die schnelle Antwort, aber es funktioniert bei mir leider nicht. Der Befehl "Set term ^ ;" löst bei mir auch wieder eine Exception aus. Ich forsche weiter. Schöne Grüße Jochen |
Re: Anweisung vor "FOR SELECT" Block
Zitat:
Aber wie genau deine Komponente das abhandelt weiß ich leider nicht. |
Re: Anweisung vor "FOR SELECT" Block
Hi,
probiers einfach mal mit
Delphi-Quellcode:
So mach ichs und das funzt einwandfrei. OK, nicht ganz so. Ich starte noch eine Transaction vor dem ExecSQL und danach schick ich noch ein Commit bzw. CommitRetaining je nach dem was danach passiert.
IB_QUERY.Close;
IB_QUERY.Unprepare; IB_QUERY.SQL[0] := 'ALTER PROCEDURE ....'; IB_QUERY.Prepare; IB_QUERY.ExecSQL; LG |
Re: Anweisung vor "FOR SELECT" Block
Hallo zusammen,
leider funktionieren eure Vorschläge bei meiner Interbase-Variante nicht. Habe es mittlerweile allerdings über Batch-Dateien geregelt, die ich von Delphi aus erstelle und aufrufe. Ich zwar nicht so elegant, klappt aber. Schönen Dank für eure Mithilfe Gruß Jochen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz