Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Variable in Select-Statement geht nicht (Stored Function) (https://www.delphipraxis.net/138451-variable-select-statement-geht-nicht-stored-function.html)

Panthrax 10. Aug 2009 19:21

Datenbank: MySQL • Version: 5.1 • Zugriff über: -

Variable in Select-Statement geht nicht (Stored Function)
 
Ich möchte den Mittelwert nur über einige Werte bilden, daher: "limit @Cnt"

SQL-Code:
create function M1_Mittelwert (Cnt int) returns Double
begin
  declare Result Double;
  select Avg(Abzugskraft) into Result from Messung1 order by Zeit desc limit @Cnt;
  return Result;
end $$
MySQL sagt dazu nur:
Code:
Script line: 4   You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@Cnt;
  return Result;
end' at line 4
Können für im Limit-Teil keine Variablen verwendet werden? Wie kann ich den Mittelwert nur über einige Werte bilden?

mkinzler 10. Aug 2009 19:43

Re: Variable in Select-Statement geht nicht (Stored Function
 
Zitat:

Können für im Limit-Teil keine Variablen verwendet werden?
Scheint so
Zitat:

Wie kann ich den Mittelwert nur über einige Werte bilden?
-In Schleife berechnen
-Statement zur laufzeit zusammensetzen ( fall MySQL dies unterstützt)

omata 11. Aug 2009 00:03

Re: Variable in Select-Statement geht nicht (Stored Function
 
Vielleicht so...
SQL-Code:
CREATE FUNCTION `func_Mittelwert`(cnt INT) RETURNS DOUBLE
BEGIN
  DECLARE result DOUBLE;

  SELECT AVG(abzugskraft) INTO result
  FROM Messung1 x
  WHERE cnt > (SELECT COUNT(*)
               FROM Messung1 
               WHERE zeit < x.zeit);


  RETURN result;
END

jensw_2000 11. Aug 2009 01:04

Re: Variable in Select-Statement geht nicht (Stored Function
 
Variablen im Limit sollten denke ich klappen.
Wenn ich mich aber recht erinnere hat Limit doch 2 Parameter.
Limit (<RecordCount>, <Offset des ersten zu suchenden Datensatzes>)

[Edit]
Falls Variablen wirklich nicht unterstützt werden könntest du alternativ eine Lösung über Dynamic SQL suchen.

ungetestst, etwa so ...
SQL-Code:
CREATE FUNCTION `func_Mittelwert`(cnt INT) RETURNS DOUBLE
BEGIN
  DECLARE result DOUBLE;
  DECLARE SQLCMD VARCHAR(500)

  SET SQLCMD = 'select Avg(Abzugskraft) into @Result from Messung1 order by Zeit desc limit ' + CAST (@Cnt as VARCHAR(4)) + ';' ;
  EXEC SQLCMD;

  RETURN result;
END

Panthrax 11. Aug 2009 13:26

Re: Variable in Select-Statement geht nicht (Stored Function
 
Den Schleifen-Ansatz habe ich verstanden, und konnte ich auch umsetzen.

Den Ansatz von Omata habe ich zwar nicht ganz verstanden, aber er funktioniert. (Ich musste für meinen Zweck nur den Vergleich drehen: Zeit > x.Zeit.) was ich nicht verstehe: Woher weiß die äußere Abfrage, über welche Werte der Mittelwert gebildet werden soll? Irgendwie steht doch da nicht mehr als bspw. "select ... from ... where 10 > 9" mit Cnt = 10...

Auf dynamisches SQL bin ich dann auch gekommen. Allerdings: "Dynamic SQL not allowed in Stored Function or Trigger." Mich würde trotzdem interessieren, wie man an das Abfrageergebnis herankommt, wenn man dynamisches SQL ausführt?

mkinzler 11. Aug 2009 13:35

Re: Variable in Select-Statement geht nicht (Stored Function
 
Dynamisches SQL heisst ja nur, dass man die Abfrage zur Laufzeit zusammenbaut ( als String) und diese dann ausführen lässt.

Panthrax 11. Aug 2009 13:44

Re: Variable in Select-Statement geht nicht (Stored Function
 
Angucken und gut? Kein weiteres Verarbeiten? Wozu braucht man dann dynamisches SQL?


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