Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Anweisung vor "FOR SELECT" Block (https://www.delphipraxis.net/42134-anweisung-vor-select-block.html)

Jochen 14. Mär 2005 13:19

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:
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
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
Delphi-Quellcode:
IB_Query.SQL.Text := ...;
IB_Query.prepare();
eine Exception geworfen.

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

Stevie 14. Mär 2005 14:28

Re: Anweisung vor "FOR SELECT" Block
 
Hi Jochen,

du musst das folgendermaßen machen:
SQL-Code:
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 ; ^
MfG
Stevie

P.S.: Willkommen in der DP!

Jochen 14. Mär 2005 14:50

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

Stevie 14. Mär 2005 14:55

Re: Anweisung vor "FOR SELECT" Block
 
Zitat:

Zitat von Jochen
Der Befehl "Set term ^ ;" löst bei mir auch wieder eine Exception aus.

Das ganze muss natürlich als Script laufen, bzw als Einzelbefehle...
Aber wie genau deine Komponente das abhandelt weiß ich leider nicht.

Lord_Stifterl 14. Mär 2005 16:41

Re: Anweisung vor "FOR SELECT" Block
 
Hi,

probiers einfach mal mit

Delphi-Quellcode:
 IB_QUERY.Close;
 IB_QUERY.Unprepare;
 IB_QUERY.SQL[0] := 'ALTER PROCEDURE ....';
 IB_QUERY.Prepare;
 IB_QUERY.ExecSQL;
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.

LG

Jochen 16. Mär 2005 14:53

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