AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Stored proc im view verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

Stored proc im view verwenden

Ein Thema von messie · begonnen am 1. Jan 2014 · letzter Beitrag vom 3. Jan 2014
Antwort Antwort
Seite 1 von 2  1 2      
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Stored proc im view verwenden

  Alt 1. Jan 2014, 17:10
Datenbank: FireBird • Version: 2.5x • Zugriff über: IBDAC
Moin,

ich habe eine stored proc geschrieben, die ich gerne über einen View aufrufen möchte:
Code:
SET TERM ^ ;
ALTER PROCEDURE DEVICECOUNT (
    ID Integer )
RETURNS (
    D_COUNT Integer )
AS
DECLARE VARIABLE COUNTER integer;
BEGIN
  D_COUNT = 0;
  FOR
    SELECT POSITION.NUMBER_OF_DEVICES from POSITION
    where POSITION.ORDER_ID = ID
    INTO :COUNTER
  DO BEGIN
    D_COUNT =: D_COUNT + COUNTER;
  END
  suspend;
END^
;
Die soll mir die Anzahl der Bauteile von n Unterpositionen liefern.

Im View rufe ich das so auf:
Code:
CREATE VIEW V_JOB_OVERVIEW (ORDER_NO, POSITIONEN_COUNT, DEVICES_COUNT)
AS  
select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT.D_COUNT

from
AUFTRAG, DEVICECOUNT(AUFTRAG.ORDERNO)




SET TERM ; ^
Leider bekomme ich beim SELECT des View mit Flamerobin eine Fehlermeldung , dass es keine row zum fetchen gäbe und der Cursor auf eine ungültige row zeigt. Der Aufruf läuft sonst ohne Fehler durch.

Was habe ich da falsch gemacht?

Grüße, Messie
  Mit Zitat antworten Zitat
jobo

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

AW: Stored proc im view verwenden

  Alt 1. Jan 2014, 21:27
Ich bin kein Firebird Spezi und hätte zunächst auf "Function" statt "Procedure" getippt, aber vielleicht geht das so in Firebird.

Zu den Fehlermeldungen:
Ein Select <Value> ..Into <Variable> wirft z.B. auch in Oracle einen Fehler, wenn kein Datensatz da ist bzw. mehr als einer.

Die Funktionalität würdest Du auch mit so einer Abfrage erreichen:
Select sum(myField) from..
ohne dass Du es selbst zählst.

Das hätte auch den Vorteil, dass immer ein Ergebnis rauskommt.
Gruß, Jo
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Stored proc im view verwenden

  Alt 1. Jan 2014, 22:12
Hallo,

komische View,
das ist doch kein richtiges SQL ?

select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT.D_COUNT
from
AUFTRAG, DEVICECOUNT(AUFTRAG.ORDERNO)

muss es nicht heissen

select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT(AUFTRAG.ORDERNO)
from
AUFTRAG

?

Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Stored proc im view verwenden

  Alt 1. Jan 2014, 23:05
Nein, weder noch.

AFAIK kann eine SP nicht als Tabelle angesprochen werden, auch wenn dort eine Abfrage generiert wird.
Und als Abfragefeld schon mal gar nicht.

Einzer denkbarer Workaround wäre eine temporäre Tabelle, die von der SP generiert wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#5

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 01:33
Die von hoika angegebene Schreibweise ist korrekt.
Die SP kann wie eine Tabelle ausgelesen werden, da sie in diesem Fall selectable ist.
Allerdings stellt sich hier die Frage, warum eine SP und nicht einfach ein SubSelect? Der Inhalt der SP ließe sich ja über ein sum erschlagen.
Thomas Breitkreuz
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 09:34
Hallo und Danke schon mal.

Das mit der sum-Funktion ist ein guter Ansatz da sich das bei Firebird wie ein einfaches select verhält.
Leider bekomme ich die Übergabe nicht mehr hin. Gestern hatte es funktioniert, da ich versehentlich den Namen einer Tabellenspalte als In-Variable vergeben hatte. Hat später die ganze DB geschrottet da sich die SP weder ändern noch löschen ließ.
Code:
CREATE
procedure TEST1
(ID_IN integer)
returns
(RESULT integer)
AS
BEGIN
  RESULT =
  (select sum(NUMBER_OF_DEVICES) from POSITIONEN
  where POSITIONEN.ORDER_ID = ID_IN);
  suspend;
END
Jetzt wird ID_IN als unknown angemeckert. Auch der Umweg über eine zusätzlich angelegte Variable klappt nicht. Ersetze ich ID_IN durch eine Zahl, bekomme ich die korrekte Tabelle raus.

Wie muss ich die Übergabe korrekt ausführen?

Den View probiere ich dann später.

Grüße, Messie
  Mit Zitat antworten Zitat
Neumann

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

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 09:47
Da fehlt der Doppelpunkt vor dem ID_IN.

CREATE
procedure TEST1
(ID_IN integer)
returns
(RESULT integer)
AS
BEGIN
RESULT =
(select sum(NUMBER_OF_DEVICES) from POSITIONEN
where POSITIONEN.ORDER_ID = :ID_IN);
suspend;
END

Wenn da nur Create Procedure steht, muss man die "alte" Procedure erst löschen, sonst funktioniert es nicht.
Besser ist "CREATE OR ALTER PROCEDURE"

Ich würde hier allerdings auch keine Procedure verwenden, macht nicht viel Sinn für die doch einfache Abfrage.

Gruß

Ralf
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 11:05
Da fehlt der Doppelpunkt vor dem ID_IN.
Arrrghh...

Bezüglich des Views habe ich das Problem, dass die Syntax von Hoika nicht laufen mag
Code:
select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT(AUFTRAG.ORDERNO)
from
AUFTRAG
Da wird zunächst Function unknown gemeldet. Wenn ich DEVICECOUNT an from Auftrag anhänge, bekomme ich ein input parameter mismatch.

Nehme ich meine obige Syntax, komme ich dann zu einem Ergebnis wenn ich einen Wert explizit angebe:
Code:
CREATE VIEW V_JOB_OVERVIEW (ORDER_NO, POSITIONEN_COUNT, DEVICES_COUNT)
AS
select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT.D_COUNT

from
AUFTRAG, DEVICECOUNT(0)
Der Wert 0 muss nicht vorhanden sein.
Muss ich da noch eine Variable vergeben oder ist mein Vorhaben doch nicht möglich?
Die Aufgabe: zu jedem Record in Table AUFTRAG können n Records in Table POSITIONEN gehören. Ich brauche die Summe aller Felder DEVICES_COUNT zu einem Auftrag. Ist das möglich?
Wie würde denn so etwas nur als view ohne SP aussehen?

Grüße, Messie
  Mit Zitat antworten Zitat
jobo

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

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 12:18
Die SP in der FromClause liefert immer einen Wert, der ungejoint mit der Hauptmenge "permutiert" wird.
Das macht hier nicht viel aus- da es nur ein Wert ist, macht aber auch keinen Sinn. Ist mir grad nicht aufgefallen.

Die Variante mit der From Clause würde Sinn machen, wenn die SP eine echte Datenmenge liefert. Weiß nicht ob firebird das kann.
Die Variante mit dem Aufruf als "Funktion" würde mehr Sinn machen, aber ich krieg da wie gesagt schon Probleme, wenn das Ding als Procedure und nicht als Function deklariert ist, wie auch immer,
so sollte ein View funktionieren:

Code:
create view V_JOB_OVERVIEW as
select a.ORDERNO, a.POSITIONENCOUNT, grp.NoDevs --, DEVICECOUNT(AUFTRAG.ORDERNO)
  from AUFTRAG a,
       (select p.ORDERNO, sum(NUMBER_OF_DEVICES) as NoDevs
          from POSITIONEN p
         group by ORDERNO) grp
 where a.ORDERNO = grp.ORDERNO;
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Stored proc im view verwenden

  Alt 2. Jan 2014, 12:19
Bezüglich des Views habe ich das Problem, dass die Syntax von Hoika nicht laufen mag
Code:
select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT(AUFTRAG.ORDERNO)
from
AUFTRAG
Da wird zunächst Function unknown gemeldet.
dann solltest Du einmal überprüfen, ob es diese Function auch gibt, oder ob beim
Code:
Create
etwas daneben gegangen ist.

Nehme ich meine obige Syntax, komme ich dann zu einem Ergebnis wenn ich einen Wert explizit angebe:
Code:
CREATE VIEW V_JOB_OVERVIEW (ORDER_NO, POSITIONEN_COUNT, DEVICES_COUNT)
AS
select
AUFTRAG.ORDERNO, AUFTRAG.POSITIONENCOUNT, DEVICECOUNT.D_COUNT

from
AUFTRAG, DEVICECOUNT(0)
Wenn ich mich da nicht vertue liefert
Code:
DEVICECOUNT(0)
genau einen Wert, (sinnvoll oder nicht lassen wir mal außen vor) dann sollte dieses Statement auch funktionieren, falls es die Funktion gibt.

Der Wert 0 muss nicht vorhanden sein.
Muss ich da noch eine Variable vergeben oder ist mein Vorhaben doch nicht möglich?
Die Aufgabe: zu jedem Record in Table AUFTRAG können n Records in Table POSITIONEN gehören. Ich brauche die Summe aller Felder DEVICES_COUNT zu einem Auftrag. Ist das möglich?
Wie würde denn so etwas nur als view ohne SP aussehen?

[/QUOTE]

Code:
Select irgendwas
from Auftrag
    ,(select Order_ID,sum(NUMBER_OF_DEVICES) DSUM from POSITIONEN group by order_ID) as DeviceCount
where DeviceCount.Order_ID=Aufrtrag.Order_ID
So ungefähr sollte es funktionieren
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:35 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