Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Eigene Datensätze zusammenstellen in Stored Function - Wie? (https://www.delphipraxis.net/138472-eigene-datensaetze-zusammenstellen-stored-function-wie.html)

Panthrax 11. Aug 2009 07:36

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

Eigene Datensätze zusammenstellen in Stored Function - Wie?
 
Ich habe zwei Funktionen F1 und F2. (Die Funktionen unten sind vereinfacht.) Nun möchte ich eine dritte Funktion erstellen, die abhängig vom Parameter Cnt Cnt Datensätze ("Zeilen") zusammenstellt. Meine Frage ist: Wie stelle ich eigentlich mehrere Datensätze zusammen? Was ist der Rückgabetyp für die Funktion?

SQL-Code:
delimiter $$

drop function if exists F1 $$
create function F1 (X Double) returns Double
begin
  return X;
end$$

drop function if exists F2 $$
create function F2 (X Double) returns Double
begin
  return X;
end$$

drop function if exists F3 $$
create function F3 (Cnt Int, X Double, Y Double) returns ???
begin
  declare I Int default 0;

  while I < Cnt do
    -- Datensätze zusammenstellen, etwa:
    --   I F1(X) F2(Y)
    --   0   12.3   45.6
    --   1   78.9   10.1
    --   .     .     .
    -- Cnt  11.2   13.1
    set I = I + 1;
  end while;
end$$

delimiter ;

omata 11. Aug 2009 19:27

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Über eine Stored-Function eine Tabelle zurückzugeben funktioniert bei MSSQL, MySQL kann so etwas nicht. Du kannst hier nicht so modularisieren, wie du dir das vorgestellt hast, vergiss es einfach.

Panthrax 12. Aug 2009 05:40

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Ist MSSQL damit so "gut" oder MySQL so "schlecht"? Können das auch anderen DBMS außer MSSQL? -- Vielleicht lohnt sich ja ein Wechsel...?

mkinzler 12. Aug 2009 06:38

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Ich bin schon lang von MySQL weg. Deshalb kenne ich mich mit dessen SP-Unterstützung garnicht aus. Eine SP in MYSQL wäre dann aus meiner Sicht kene SP sondern eher eine UDF.
Deine Frage
Zitat:

Ist MSSQL damit so "gut" oder MySQL so "schlecht"?
würde ich dann mit MySQL ist schlecht beantworten. Den dieses Feature sollte fast jedes DBMS unterstützen.

Mehrere Datensätze wären Z.B. in IB/FB kein Problem; jeder Aufruf von
SQL-Code:
suspend;
liefert einen Datensatz zurück.

omata 12. Aug 2009 09:16

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Zitat:

Zitat von Panthrax
Ist MSSQL damit so "gut" oder MySQL so "schlecht"? Können das auch anderen DBMS außer MSSQL? -- Vielleicht lohnt sich ja ein Wechsel...?

Deine Vorgehenweise ist für eine Datenbank unbrauchbar, da ist es nicht nötig, über Vorteile oder Nachteile verschiedener Systeme zu spekulieren. Du kannst in einer Datenbank die Funktionen/Prozeduren nicht (ganz) so einsetzten, wie du es in einer Programmiersprache kannst. Eingeschränkt ist dies zwar möglich, aber genau dein jetziger Ansatz ist problematisch. Er ist nicht unmöglich (zu mindest in MSSQL) aber er schränkt dich eigentlich mehr ein, als du Vorteile davon hast (bedingt durch die Nachteile denen man unterliegt, weil in Funktionen nicht alles geht und weil, wenn man als Rückgabewert eine Tabellenstruktur angibt, diese nicht dynamisch zusammengestellt werden kann, die Geschwindigkeit erwähne ich erst gar nicht, die ist dann richtig unterirdisch!).
Eine andere Möglichkeit wäre eine temporäre Tabelle zu benutzen, dies führt allerdings bei Mehrbenutzerbetrieb zu Problemen, deshalb solltest du alles in deine Funktionen einbauen. Oder vielleicht über einen Übergabeparameter festlegen, was du berechnen willst, dann ist das Datensammeln nur einmal zu implementieren.
Wie auch immer, da du hier nur schreibst wie du dein Problem lösen willst und nicht was du eigentlich erreichen willst, kann man dir auch keinen (richtigen) alternativ Vorschlag machen.

Zitat:

Zitat von mkinzler
Mehrere Datensätze wären Z.B. in IB/FB kein Problem; jeder Aufruf von
SQL-Code:
suspend;
liefert einen Datensatz zurück.

Auch aus einer UDF? Das wäre mir neu, aber das wäre genial.

Elvis 12. Aug 2009 09:37

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Zitat:

Zitat von mkinzler
Ich bin schon lang von MySQL weg. Deshalb kenne ich mich mit dessen SP-Unterstützung garnicht aus. Eine SP in MYSQL wäre dann aus meiner Sicht kene SP sondern eher eine UDF.

Ich glaube in der IB/FB Szene werden diese 2 Begriffe (SB & UDF) etwas komisch benutzt (zumindest für mich als jmd, der auch Oracle nutzt).
Hauptsächlich weil FB gar keine Funktionen deklarieren sondern die nur aus native Libs importieren kann.

@Topic, so wie ich es gesehen habe, kann sogar ySQL Resultsets aus einer SProc zurückgeben. Aber das ist dann genauso beschissen unwartbar gelöst wie in MSSQL.
Und zwar jedes Select in deiner SProc, das keine Werte setzt, wird plötzlich zu einem Resultset für den, der die SProc aufruft. :freak:
Einfache SProc, ohne Ergebnis:
SQL-Code:
create procedure NoResultset
begin
  declare someVar Int;
  SELECT abc
  INTO  someVar
  FROM  def
  where xyz = 42;
end
Eine Sproc, die ein Resultset erzeugt:
SQL-Code:
create procedure WithResultset
begin
  SELECT abc
  /* INTO  someVar */
  FROM  def
  where xyz = 42;
end
Oops, keine Compiler-Fehlermeldung, kein gar nix. Aber plötzlich kommt da ein Ergebnis? :shock:

Ich habe kein mySQL hier und ich nutze es auch nicht, weil ich bisher immer Argumente fand warum das Viech in kritischen Umgebugnen nix zu suchen hat.
Aber so habe ich deren Doku-Page zu Sprocs nach dem Überfliegen verstanden.

omata 12. Aug 2009 09:46

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Zu Elvis...

Ja Prozeduren, damit geht es zwar eine Tabelle zurückzugeben, aber eine Prozedur kann man nicht innerhalb einer SQL-Abfrage aufrufen bzw eine Prozedur kann man nicht innerhalb einer Funktion aufrufen (zumindest ist das in MSSQL so). Das liegt einfach daran, dass man innerhalb von Prozeduren Daten in der Datenbank ändern kann und innerhalb einer Funktion nicht.

Panthrax 12. Aug 2009 17:20

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Was möchte ich eigentlich machen?

Die Datengrundlage wird in einer Ansicht zusammengestellt, und besteht aus einer Spalte Double-Werte. Die Werte sind zeitlich sortiert, der neueste Wert steht oben. Derzeit arbeiten alle Funkionen fest mit dieser Ansicht. (Die Datenquelle zu parametrisieren soll später noch kommen.)

Nun gibt es z.B. eine Funktion Standardabweichung(Idx Int, Cnt Int), welche die Standardabweichung für Cnt Werte ab dem (Idx+1)ten Wert berechnet.

In einer anderen Funktion brauche ich die Standardabweichungen von GrpCnt Gruppen mit je GrpSize Werten. D.h., die Werte in der Ansicht werden gedanklich zu Gruppen zusammengefasst, z.B. die 1. 5 Werte, dann die 2. 5 Werte, die 3. 5 Werte usw., oder die 1. 6 Werte, dann die 2. 6 Werte, die 3. 6 Werte uswusf...

Ich brauche also eine Funktion F(Idx Int, GrpCnt Int, GrpSize Int), die mir (u.a.) die Standardabweichungen für GrpCnt Gruppen mit je GrpSize Werten und mit der ersten Gruppe beginnend ab dem (Idx+1)ten Wert zusammenstellt.

Zur Verdeutlichung:
SQL-Code:
delimiter $$
drop function if exists F$$
create function F (Idx Int, GrpCnt Int, GrpSize Int) returns ???
begin
  declare Result ???;
  declare I Int;
  declare Stabw Double;

  -- Für jede Gruppe...
  set I = 0;
  while I < GrpCnt do
    set Stabw = Standardabweichung(Idx + I * GrpSize, GrpSize);
    -- Und wo nun die Standardabweichung zwischenspeichern?
    set I = I + 1;
  end while;

  return Result;
end$$
delimiter ;
Die Frage ist also: Wie kann ich ein "Array" zurückgeben? Und der Vollständigkeit halber: Wie kann ich die Datenquelle parametrisieren? Wie kann ich einer Funktion sagen, dass sie die Werte aus dieser oder jener Ansicht oder Tabelle nehmen soll?

Das ist es was ich machen will. Bin für jede Hilfe dankbar. Und, vielen Dank soweit.

omata 12. Aug 2009 20:04

Re: Eigene Datensätze zusammenstellen in Stored Function - W
 
Warum muss das im Datenbankserver ausgeführt werden? Schreib doch diese Funktionen als Delphicode.


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