![]() |
Datenbank: FB • Version: 1.5 • Zugriff über: FIBPlus
Stored Procedure innerhalb anderer SP
Hi,
Zuerst die SP :
SQL-Code:
Die liefert eine Datenmmenge zurück, die eben nur durch ID <= 111 eingeschränkt ist. Die innere SP ERMITTLE_ARTPREIS hat einen Rückgabewert PREIS und der steht immer auf 0. Lasse ich die einzeln laufen, dann wird der richtige Wert angezeigt. Allerdings sieht es so aus, daß der Wert Preis auf einem Wert stehenbleibt. Vorhin hat mit anderem WHERE überall als Preis 13,44 drin gestanden. Was ist da falsch ?
CREATE PROCEDURE TESTPREISSP8
RETURNS ( ID INTEGER, NR INTEGER, BEZ CHAR(30), PREIS DECIMAL(15,2)) AS begin for select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006') where (ID <= 111) into :ID,:NR,:BEZ, :PREIS do suspend; end^ |
Re: Stored Proceduree immerhalb anderer SP
Hallo Hansa,
das ist der seltsamste JOIN, den ich jemals gesehen habe. Führe doch SELECT und den Aufruf der inneren SP hintereinander aus. Grüße vom marabu |
Re: Stored Proceduree immerhalb anderer SP
Der Code von "Ermittle_ArtPreis" ist nicht uninteressant um den Fehler zu finden :o)
Ein direkter JOIN wäre ihmo am Besten. Falls der Code in ERMITTLE_ARTPREIS sehr komplex ist, und du ihn auslagern möchtest, dann ist aus meiner Sicht eine eine UDF für diesen Zweck angebrachter. Variante 1: (bei "relativ" wenigen Artikeln)
SQL-Code:
Das Ganze dann mit deinem äußeren SELECT Joinen.
CREATE FUNCTION Ermittle_Artpreis
( Zeitpukt DATETIME ) RETURNS TABLE AS SELECT ID,ArtNr,Preis FROM ... bla Variante 2: (bei "relativ" vielen Artikeln)
SQL-Code:
[/sql]
FUNCTION Get_ARTPREIS
( @ID INT, @Zeitpukt DATETIME ) RETURNS MONEY AS RETURN SELECT TOP 1 Preis FROM ... bla WHERE ID = @ID AND @Zeitpunkt BETWEEN Preis_Startdatum AND Preis_EndDatum verwenden:
SQL-Code:
/ EDIT : UDF berbessert
SELECT ID,ArtNr,Preis FROM ... bla
SELECT ID, NR, BEZ, dbo.Get_ARTPREIS ('01.01.2006') FROM Artikel WHERE ... |
Re: Stored Proceduree immerhalb anderer SP
Zitat:
Zitat:
|
Re: Stored Procedure innerhalb anderer SP
Zitat:
Du machst ein SELECT auf ART und ein singleton SELECT auf ERMITTLE_ARTPREIS. Dein JOIN bildet das kartesische Produkt - das singleton result wird nie mehr verändert und bezieht sich immer auf den Zufallswert von ID, bevor du die Variable in der INTO-Klausel befüllst. Klappen tut es schon, aber es tut nicht was du willst. Kannst du nicht erst dein SELECT FROM ART INTO machen und anschließen über das dann determinierte ID deine SP aufrufen? marabu |
Re: Stored Procedure innerhalb anderer SP
Hi Hansa,
versuchs doch mal damit
SQL-Code:
alex
CREATE PROCEDURE TESTPREISSP8
RETURNS ( ID INTEGER, NR INTEGER, BEZ CHAR(30), PREIS DECIMAL(15,2)) AS begin for select A.ID, A.NR, A.BEZ, P.PREIS from ART A join ERMITTLE_ARTPREIS (A.ID, 5, '01.01.2006') P on (1=1) where (ID <= 111) into :ID,:NR,:BEZ, :PREIS do suspend; end^ |
Re: Stored Procedure innerhalb anderer SP
@jens : hier die SP
SQL-Code:
@Marabu : Du meinst ein "Select from select from select" in der Richtung, oder was ?
CREATE PROCEDURE TESTPREISSP8 (
ID_ART INTEGER, ABDATUM DATE) RETURNS ( PREIS DECIMAL(15,2)) AS BEGIN SELECT FIRST 1 PREIS FROM ART WHERE (ID_ART = :ID_ART) AND (ABDATUM <= :ABDATUM) ORDER BY ABDATUM DESC INTO :PREIS; IF (PREIS IS NULL) THEN PREIS = 0; SUSPEND; END^ @Alex : wie es aussieht ist das genau das, wie ich das eigentlich vorhatte. Aktuell hat sich allerdings noch herausgestellt, daß es auch gut wäre, ein Anfangs- und Enddatum zu haben, also BETWEEN. Wie ich das sehe, wäre der Join mit der SP dann eher ein Umweg. Muß das alles jetzt erst mal testen. Und daß solch "seltsamer Code" geht, das weiß ich ! Aber nicht mehr wie genau. :mrgreen: Noch eine Frage Zitat:
|
Re: Stored Procedure innerhalb anderer SP
Zitat:
JOIN <tableref> ON <search_condition> und da <search_condition> nun mal verlangt wird, kommt da auch eine hin (1=1) ;-) alex |
Re: Stored Procedure innerhalb anderer SP
Also praktisch nur Dummy-Funktion ? :shock: Dein Code geht übrigens ! Mit folgender Änderung :
SQL-Code:
Verstehe zwar nicht wieso, aber so gehts. Noch weniger verstehe ich allerdings, wieso mein Anfangscode nicht ging. 8)
from
ART A left join... |
Re: Stored Procedure innerhalb anderer SP
SQL-Code:
Ich schätze hier liegt eine Verwechslung vor zwischen ID und ID.
CREATE PROCEDURE TESTPREISSP8
RETURNS ( ID INTEGER, NR INTEGER, BEZ CHAR(30), PREIS DECIMAL(15,2)) AS begin for select ID, NR, BEZ, PREIS from ART, ERMITTLE_ARTPREIS (ID,5,'01.01.2006') where (ID <= 111) into :ID,:NR,:BEZ, :PREIS do suspend; end^ Da steht ERMITTLE_ARTPREIS (ID,5,'01.01.2006'): Das ID bezieht sich aber auf den Rückgabeparameter ID und nicht auf das ID, das du aus ART liest. Eigentlich müsste da zwar noch ein Doppelpunkt davor stehen, aber der Compiler beschwert sich oftmals trotzdem nicht. Hab ich mir auch schon paar mal die Zähne ausgebissen... Was du wolltest, war wohl eher:
SQL-Code:
CREATE PROCEDURE TESTPREISSP8
RETURNS ( ID INTEGER, NR INTEGER, BEZ CHAR(30), PREIS DECIMAL(15,2)) AS begin for select ID, NR, BEZ from ART where (ID <= 111) into :ID,:NR,:BEZ do begin select PREIS from ERMITTLE_ARTPREIS(:ID,5,'01.01.2006') into :PREIS; suspend; end end^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz