PDA

View Full Version : SQL fetch for 500 rows into :DS



Robi
20-09-17, 12:41
Moin zusammen

Ein PGM macht ein

fetch from c1 for 500 rows into doppelpunktDS

Die DS hat 5 Felder, ist qualified definiert mit dim(500)
Funktioniert bestens!

Jetzt wird eine andere View verwendet, die einzelnde Felder als NULL zurück bringen kann

ich habe zunächst die Null indikatoren in die DS eingebaut.
Das läst sich wandeln, funktioniert aber nicht (versteh ich)
Dann habe ich eine 2. DS definiert mit NULL Indikatoren für alle Felder und mach nun

fetch from c1 for 500 rows into doppelpunktDS :IND

IND ist auch qualified und dim(%elem(DS))

aber das läst sich nicht wandeln. (Ind ungültig)

Wie ist die richtige Syntax?


Danke
Robi

BenderD
20-09-17, 13:08
Moin zusammen

Ein PGM macht ein

fetch from c1 for 500 rows into doppelpunktDS

Die DS hat 5 Felder, ist qualified definiert mit dim(500)
Funktioniert bestens!

Jetzt wird eine andere View verwendet, die einzelnde Felder als NULL zurück bringen kann

ich habe zunächst die Null indikatoren in die DS eingebaut.
Das läst sich wandeln, funktioniert aber nicht (versteh ich)
Dann habe ich eine 2. DS definiert mit NULL Indikatoren für alle Felder und mach nun

fetch from c1 for 500 rows into doppelpunktDS :IND

IND ist auch qualified und dim(%elem(DS))

aber das läst sich nicht wandeln. (Ind ungültig)

Wie ist die richtige Syntax?


Danke
Robi

... so aus dem Kopf, mach mal ein Array 4b 0 dim(xxx)
je nach Anwendung ist zuweilen coalesce mehr kommod.

D*B

Robi
20-09-17, 13:32
Ja, danke

Wenn ich anstatt der einzel IND-Felder ein Feld mit DIM verwende geht es tatsächlich

also

d DS ds dim(500) qualified inz
d f1 1A
d F2 5S 0
d f3 10A

d ind ds dim(%elem(DS)) qualified inz
d indi 5i 0 dim(3)

abfrage für den indikator des feldes F3
if ind(x).indi(3) = -1
...
endif

irgendwie nicht so schön, wenn sich die DS mal 'mittendrin' erweitert aber ok, funktioniert
Danke
Robi

BenderD
20-09-17, 13:52
irgendwie nicht so schön, wenn sich die DS mal 'mittendrin' erweitert aber ok, funktioniert
Danke
Robi

... dann machst Du was verkehrt!!! Eine View ändert sich nie und die e ds gehört auf die View und dann select * in die DS. Wenn Felder dazukommen, gibt es eine zusätzliche View und zuweilen darf eine alte weg. In allen Fällen von nicht select * ist Feldliste in Feldliste angesagt. (Wer einmal zwei Felder beim select into verwechselt hat, der weiß sofort warum)

D*B

Robi
20-09-17, 14:07
Eine View ändert sich nie

Hier schon, es wird sehr wenig mit views gearbeitet,
hauptsächlich um 3-10 Dateien mit einem Lesevorgang im Zugriff zu haben.

Select * gibt es (fast) nicht
Was meinst du mit Feldliste in Feldliste?

Ich meine: (nur als Bsp!)

DS dim() qualified
name 30
plz 5p 0
ort 22
und nach 2 Jahren kommt ZWISCHEN Name und PLZ die Strasse.

Könnte ich im Pgm auch dahinter in die DS aufnehmen, DARF ich aber nicht.
(Feld reihenfolge = Datei reihenfolge)
Die Str ist seid beginn in der View vorhanden

Feldliste in Feldliste ... was ist das?
Danke
Robi

BenderD
20-09-17, 14:13
Hier schon, es wird sehr wenig mit views gearbeitet,
hauptsächlich um 3-10 Dateien mit einem Lesevorgang im Zugriff zu haben.

Select * gibt es (fast) nicht
Was meinst du mit Feldliste in Feldliste?

Ich meine: (nur als Bsp!)

DS dim() qualified
name 30
plz 5p 0
ort 22
und nach 2 Jahren kommt ZWISCHEN Name und PLZ die Strasse.

Könnte ich im Pgm auch dahinter in die DS aufnehmen, DARF ich aber nicht.
(Feld reihenfolge = Datei reihenfolge)
Die Str ist seid beginn in der View vorhanden

Feldliste in Feldliste ... was ist das?
Danke
Robi

... genau für mehrere Dateien in einem Lesevorgang gibt es Views.
statt select Feld1, Feld2, Feld3 into :someDS
select Feld1, Feld2, Feld3 into :Feld1, :Feld2, :Feld3
analog natürlich auch
Select sum(Feld1) Feld1, sum(Feld2) Feld2 ... into :Feld1, :Feld2...

dann sieht man sofort auf den ersten Blick was wohin zu passen hat.
Aber ihr seid ja wohl von der noRisc noFun Fraktion - sowas wie Feld auch noch mittenrein würde ich mir nie antun.

D*B

Robi
20-09-17, 14:28
Na ja, das gibt es hier natürlich auch
aber manchmal ist es besser alle Sätze in eins in eine DS zu lesen (hier max 500)
(darum ging es hier)


sowas wie Feld auch noch mittenrein würde ich mir nie antun.
Da gebe ich dir Recht, das ist ein unnütze blödsinnige Vorgabe.
Aber es ist nunmal eine ...
(und diese Diskusion ... unnütz, blödsinn ... habe ich schon all zu oft geführt)
vllt raff ich moch mal auf mit der Argument das der NullIndikator eine DIM-DS sein muß.

BenderD
20-09-17, 14:47
Na ja, das gibt es hier natürlich auch
aber manchmal ist es besser alle Sätze in eins in eine DS zu lesen (hier max 500)
(darum ging es hier)


... Block fetch ist für alle dirty reads ala Subfile füllen schon aus Performancegründen anzuraten (1000 Sätze dauern solang wie einer) macht man updates holt der positioned update das mehr als auf und ist schneller. Aber genau da würde ich immer eine View anlegen.

Was Änderungen an externen Datenstrukturen angeht, das wird doch spätestens zum Horror, wenn diese in Parameterschnittstellen vorkommen, oder mit dynamic SQL verwendet werden und vielleicht noch SQL Skripte aus Dateien kommen.

D*B

ExAzubi
21-09-17, 10:39
Ich dachte immer bei einem fetch for x rows müsste die DS immer OCCUR definiert sein, nicht DIM?!?!?!

BenderD
21-09-17, 10:41
... typischer Fall vonDenkste :-)