AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Eigene Datensätze zusammenstellen in Stored Function - Wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Datensätze zusammenstellen in Stored Function - Wie?

Ein Thema von Panthrax · begonnen am 11. Aug 2009 · letzter Beitrag vom 12. Aug 2009
Antwort Antwort
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#1

Eigene Datensätze zusammenstellen in Stored Function - Wie?

  Alt 11. Aug 2009, 07:36
Datenbank: MySQL • Version: 5.1 • Zugriff über: -
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 ;
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 11. Aug 2009, 19:27
Ü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.
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

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

  Alt 12. Aug 2009, 05:40
Ist MSSQL damit so "gut" oder MySQL so "schlecht"? Können das auch anderen DBMS außer MSSQL? -- Vielleicht lohnt sich ja ein Wechsel...?
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 12. Aug 2009, 06:38
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 suspend; liefert einen Datensatz zurück.
Markus Kinzler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 12. Aug 2009, 09:16
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 von mkinzler:
Mehrere Datensätze wären Z.B. in IB/FB kein Problem; jeder Aufruf von suspend; liefert einen Datensatz zurück.
Auch aus einer UDF? Das wäre mir neu, aber das wäre genial.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#6

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

  Alt 12. Aug 2009, 09:37
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.
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?

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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 12. Aug 2009, 09:46
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.
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#8

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

  Alt 12. Aug 2009, 17:20
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.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 12. Aug 2009, 20:04
Warum muss das im Datenbankserver ausgeführt werden? Schreib doch diese Funktionen als Delphicode.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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