AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi selectable stored procedure
Thema durchsuchen
Ansicht
Themen-Optionen

selectable stored procedure

Ein Thema von SvB · begonnen am 25. Dez 2016 · letzter Beitrag vom 27. Dez 2016
Antwort Antwort
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

selectable stored procedure

  Alt 25. Dez 2016, 11:54
Datenbank: Firebird • Version: 2.5 • Zugriff über: Firedac
Ich habe eine selectable stored procedure die ich mit einem Parameter (KDNR) aufrufe. Diesen Parameter benutze ich im WHERE des SQL.
Code:
SELECT ... FROM Kunden WHERE KDNR=:KDNR
Jetzt möchte ich einen optionalen zweiten Parameter (ID) übergeben. Ist es möglich das WHERE abhängig vom übergebenen Parameter zu wählen. Entweder ist dann KDNR null oder ID null.
Das SELECT und die Felder sind immer gleich.
Also
Code:
SELECT ... FROM Kunden WHERE KDNR=:KDNR
oder
SELECT ... FROM Kunden WHERE ID=:ID
Geht so etwas, dass ich nicht alles doppelt habe?
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: selectable stored procedure

  Alt 25. Dez 2016, 12:12
Du kannst Select Statements, die die gleiche Struktur ausgeben per Union bzw. Union all hintereinander hängen:
Code:
select feld1, .. feldx from mytable where ein Bedingung
union
select feld1, .. feldx from mytable where andere Bedingung
Dann gibt es das Problem auf NULL zu prüfen. Es wird nicht mit
Code:
feldxy<!>=Null
gemacht, sondern mit

Code:
feldxy is <not> Null
Das bedeutet, Du musst vorher(vor dem SQL Abruf) wissen, ob ein PArameter leer ist oder nicht und das SQL entsprechend anlegen.
Das sollte aber in einer SP kein Problem sein oder?
Du schickst dann nach der Prüfung unterschiedliche SQL Statements ab, die entweder den einen oder den anderen Parameter nutzen.

P.S.: ach so, Du kannst natürlich die verschiedenen Kriterien mit OR hintereinander in die WHERE Bedingung hängen. Das bedeutet aber etwas Ressourcenverschwendung. Denn es werden dann alle 4, 5 .. Abfragen durchgeführt auch wenn Du immer nur eine brauchst.
P.S.2: Das UNION fasst automatisch Mehrfachergebnisse zusammen zu einem Datensatz, UNION ALL würde alle Ergebnisse einzeln aufführen, also auch Mehrfachtreffer.
Gruß, Jo

Geändert von jobo (25. Dez 2016 um 12:15 Uhr)
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: selectable stored procedure

  Alt 25. Dez 2016, 12:31
OK, alles klar.
Ich möchte nichts hintereinander hängen.
Ich möchte praktisch einmal nach Kundennummer (KDNR) oder ID abfragen. Die zurückgegebenen Struktur ist immer gleich.
Code:
CREATE PROCEDURE SP_CXKD (
    KDNR varchar(8) )
RETURNS ( 
    KD_NR varchar(8),
    KD_NAME1 varchar(35) )
AS
BEGIN
    FOR SELECT
        a.KD_NR,
        a.KD_NAME1
    FROM CXKD a WHERE a.KD_NR=:KDNR  <--- einziger Unterschied
    INTO
        KD_NR,
        KD_NAME1 
    DO
    BEGIN
        SUSPEND;
    END
END!!
oder
Code:
CREATE PROCEDURE SP_CXKD (
    ID integer )
RETURNS ( 
    KD_NR varchar(8),
    KD_NAME1 varchar(35) )
AS
BEGIN
    FOR SELECT
        a.KD_NR,
        a.KD_NAME1
    FROM CXKD a WHERE a.ID=:ID   <--- einziger Unterschied
    INTO
        KD_NR,
        KD_NAME1 
    DO
    BEGIN
        SUSPEND;
    END
END!!
kann man das geschickt in eine einzelne SP zusammenfassen?
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
542 Beiträge
 
Delphi 12 Athens
 
#4

AW: selectable stored procedure

  Alt 25. Dez 2016, 12:57
Ich sehe den Sinn der SP hier nicht so richtig, es sind doch nur einfache Abfragen, die ein Select auf die Tabelle auch reichen würde.

Man könnte es so lösen:
Code:
CREATE PROCEDURE SP_CXKD (
    KDNR varchar(8), ID integer )
RETURNS ( 
    KD_NR varchar(8),
    KD_NAME1 varchar(35) )
AS
BEGIN
   if (KDNR <> '') then
   begin
    FOR SELECT a.KD_NR, a.KD_NAME1 FROM CXKD a WHERE a.KD_NR=:KDNR INTO KD_NR, KD_NAME1 
    DO SUSPEND;
   END ELSE
   begin
    FOR SELECT a.KD_NR, a.KD_NAME1 FROM CXKD a WHERE a.ID=:ID INTO KD_NR, KD_NAME1 
    DO SUSPEND;
   END

 
END!!
So sollte es gehen. Man übergibt immer 2 Parameter.
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: selectable stored procedure

  Alt 25. Dez 2016, 15:14
Tja der Sinn, vielleicht denkt der TE, SP ist schneller?
Das wäre hier falsch gedacht.

Zum Vorschlag:
Im Prinzip ok, ich würde allerdings überlegen, wie die Prozedur aufgerufen werden kann/soll und wie entsprechend die Parameter abzusichern sind.
Idiotensicher mit vollständiger Prüfung innerhalb der SP> welche Parameter sind überhaupt befüllt?
>Welcher Aufruf des Select macht dann also Sinn?

Geschützter Aufruf> Anwendung überwacht die Befüllung der Parameter und setzt nur vorgeprüfte Parameterkombi ab.

Im Beispiel ist die Parameterprüfung mit anschließender Verzweigung recht grob und kann zu schlechten Ergebnissen führen.
Gruß, Jo
  Mit Zitat antworten Zitat
SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: selectable stored procedure

  Alt 25. Dez 2016, 15:17
Danke.
Das hier waren nur Beispiele, ich wollte keine 50 Zeilen Code posten.
Ich probiere das so mal aus.
Sven

Alle sagen, das geht nicht. Da kam einer, der wusste das nicht und hat es gemacht.
  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 05:50 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-2025 by Thomas Breitkreuz