Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Interbase: Mischen von Select und Stored Procedure (https://www.delphipraxis.net/11644-interbase-mischen-von-select-und-stored-procedure.html)

r_kerber 11. Nov 2003 08:35


Interbase: Mischen von Select und Stored Procedure
 
Hallo,

hier wieder mal eine Frage an die Interbase-Insider :lol:
Ich habe eine Stored Procedure erstellt.
SQL-Code:
set term !! ;
CREATE PROCEDURE ErmittleDurchschnitt
RETURNS (
    DP DECIMAL (8,2))
AS
begin
  /* Procedure Text */
  select avg (PREIS) FROM WERBEARTIKEL
    into :DP;


end !!
set term ; !!
Wenn ich diese mit EXECUTE aufrufe erhalte ich auch ein Ergebnis zurück. In einem Beispiel, dass ich habe wird diese Procedure nun in einem SELECT-Statement genutzt:
SQL-Code:
select ErmittleDurchschnitt() AS "Durchschnitt", Beschreibung, Lagerbestand, Preis
from Werbeartikel
Interbase 6.5 liefert mir hier jedoch Fehler zurück. Mit den beiden runden Klammer erhalte ich function unknown ohne die Klammern column unknown. :wall:

Lemmy 12. Nov 2003 07:44

Re: Interbase: Mischen von Select und Stored Procedure
 
Hi,

hast Du nicht vor ein paar Tagen schon mal eine Frage bzgl. SP in Interbase gestellt?? Da wurde Dir doch ausdrücklich gesagt (falls nicht, dann sei Dir verziehen ;-) ), dass
*Select-SP immer mit Select ausgeführt werden
*Executable-SP immer mit Execute
*zu einer Select-SP immer ein For-Select-Do gehört

Also muss deine SP so aussehen, damit es auch mit der Nachbarin klappt :-D :

SQL-Code:
set term !! ;
CREATE PROCEDURE ErmittleDurchschnitt
RETURNS (
    DP DECIMAL (8,2))
AS
begin
  /* Procedure Text */
  FOR
  select avg (PREIS) FROM WERBEARTIKEL
    into :DP
  DO
    SUSPEND;
end !!
Nun zu deiner Select:

Eine Procedure ist KEINE Function! Du rufst Die SP aber wie eine Funktion auf!!!! Versuch es mal so:

SQL-Code:
select DP AS "Durchschnitt", Beschreibung, Lagerbestand, Preis
from Werbeartikel, ErmittleDurchschnitt
So sollte es eigentlich klappen. Du musst aber aufpassen, sollte die SP mehr als einen Wert zurückliefern, würde diese Select zu einem kartesischen Produkt führen (d.h. alles aus Tabelle 1 (Werbeartikel) wird mit allem aus Tabelle 2 (ErmittleDurchschnitt) zusammengewürfelt. In einem solchen Fall musst Du mit einem Join die Tabellen verknüpfen.

Grüße
Lemmy

r_kerber 12. Nov 2003 07:55

Re: Interbase: Mischen von Select und Stored Procedure
 
Hallo Lemmy,

danke, so funktioniert es. :oops: Ich kann mich jedoch des Eindrucks nicht erwehren, das Interbase 6.5 nicht so ganz SQL-92-konform ist. Hier das Ergebnis eines Tests auf SQL-92:
Zitat:

CREATE PROCEDURE ErmittleDurchschnitt
RETURNS (
^------
syntax error: RETURNS (
correction: (

DP DECIMAL (8,2))
AS
^-
syntax error: AS begin
correction: begin

begin
/* Procedure Text */
^ ^
syntax error: / * Procedure Text
correction: Text
syntax error: * / FOR
correction: : FOR

FOR
select avg (PREIS) FROM WERBEARTIKEL
^----- ^---
syntax error: FOR select
correction: BEGIN select
syntax error: FROM WERBEARTIKEL
correction: WERBEARTIKEL

into :DP
DO
^-
syntax error: DO
correction: FROM

SUSPEND;

^
syntax error: <end>
expected: <delimited identifier> <identifier> ABSOLUTE ALLOCATE ALTER BEGIN
CALL CASE CLOSE COMMIT CREATE DEALLOCATE DELETE DESCRIBE END
EXECUTE FETCH FOR GET IF INSERT LEAVE LOOP OPEN PREPARE REPEAT
RESIGNAL RETURN ROLLBACK SELECT SET SIGNAL START UPDATE WHILE
correction: END ; END <end>
Weiß jemand wie es bei Interbase 7.1 aussieht? Laut Hochglanzprospekten soll hier ja SQL-92 umgesetzt sein.

MrSpock 12. Nov 2003 08:20

Re: Interbase: Mischen von Select und Stored Procedure
 
Hallo Lemmy,

wenn die Abfrage wie in diesem Fall nur einen Wert zurückgibt, reicht ein einfaches SUSPEND, die Schleife wäre dann nicht nötig:

SQL-Code:
CREATE PROCEDURE ErmittleDurchschnitt
RETURNS (
    DP DECIMAL (8,2))
AS
begin
  /* Procedure Text */
  select avg (PREIS) FROM WERBEARTIKEL
    into :DP;
  SUSPEND;
end

Lemmy 12. Nov 2003 09:00

Re: Interbase: Mischen von Select und Stored Procedure
 
Zitat:

Zitat von MrSpock
wenn die Abfrage ...

Danke für den Hinweis!!!


@r_kerber:

Ich kenne mich mit der IB-Schiene ab der 6.5er nicht mehr genau aus. Eines ist jedoch sicher: Jeder SQL-Server kocht bei der Trigger und StoredProcedure-Language sein eigenes Süppchen. Selbst wenn jemand sagt, dass ein bestimmter SQL-Server eine bestimmte SQL-Norm unterstützt, so heißt das nicht, dass Du einfach eine SQL vom einen Server auf den anderen mit Copy-and-Paste kopieren kannst.

Grüße
Lemmy

r_kerber 12. Nov 2003 09:22

Re: Interbase: Mischen von Select und Stored Procedure
 
@Lemmy: :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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