Anmelden

View Full Version : SQL Anfänge: SENSITIVE CURSOR - For Fetch Only



Curan
20-12-10, 08:08
Hallo!

Ich bin momentan dabei meine ersten kleinen Schritte mit SQL in RPGLE zu machen und habe dazu einige Fragen.

Ich möchte SQL in meiner Protokollierungsanzeige verwenden, was auch soweit funktioniert, allerdings habe ich Probleme mir Datensätze anzeigen zu lassen die nach dem öffnen meines Cursor in die Tabelle hinzugefügt wurden.

Falls ich alles richtig verstanden habe muss ich meinen Cursor als "SENSITIVE" definieren - in wie weit verlangsamt das meine Abfragen?

Außerdem setze ich mir mein Select zusammen (in dem ein ORDER BY vorhanden ist) und führe anschließend folgendes aus:



C/Exec SQL
C+ Prepare Sel_001 From :SqlStm
C/End-Exec
C/Exec SQL
C+ Declare Csr_001 Scroll Cursor for Sel_001
C/End-Exec
C/Exec SQL
C+ Open Csr_001
C/End-Exec
Nun würde ich gerne den Cursor als "for fetch only" definieren, was mir allerdings nicht erlaubt wird.


Nachricht . . . : Schlüsselwort FOR nicht erwartet. <ende der="">

liebe Grüße
</ende>

B.Hauser
20-12-10, 08:46
Hallo,

1. Wo willst Du das FOR READ ONLY angeben?
FOR READ ONLY ist Bestandteil des SELECT-Statements (und nicht des DECLARE-Statements) und muss deshalb in den String der PREPARED werden soll integriert werden.

2. Ist das SQL statement wirklich dynamisch, d.h. werden unterschiedliche Spalten verwendet oder wechseln die Dateien/Tabellen bei den einzelnen Aufrufen.
Wenn beides mit NEIN beantwortet werden kann, ist dynamsiches SQL NICHT erforderlich.
Hostvariablen für unterschiedliche Selektionen und unterschiedliche Sortiertungen über CASE-Anweisungen sind beim statischen SQL möglich.
Beim statischen SQL wird das SQL Statement zur Compile-Zeit geprüft und fällt nicht erst zur Laufzeit auf die Nase.

Birgitta

Curan
20-12-10, 08:56
Guten Morgen!

Herzlichen dank für die schnelle Antwort Fr. Birgitta.

Zum Punkt 1:
Schande über mein Haupt, ich war mir dessen nicht bewusst. Danke nochmals!

Punkt 2:
Da in der Protokollanzeige Filterungen möglich sind, setze ich mir den String bei Änderungen neu zusammen.

(#HK = ')


SqlStm = 'Select * from TSTPROT where STATUS like ' + #HK + %trim(bsStatus) + #HK + ' order by fNR DESC';Beim 1. Aufruf & falls mein Suchfeld leer ist befülle ich die Variable bsStatus mit '%'.

Falls ich hier mist zusammen rede (was sehr gut möglich ist) bitte ich das zu entschuldigen.

BenderD
20-12-10, 09:19
... den like könnte man noch ganz gut auflösen (select ... where Feld like :HostVar) beim Order by kann man mit hinreichendem Releasestand auch mit Case Konstrukten noch was zusammen basteln.
Mit dynamischem SQL ist man aber für solche Filterungen deutlich flexibler.
Von den Vorteilen des statischen SQL bleibt ohnehin nur die Prüfung zur Compiletime, die Performance Vorteile fallen bei Case Konstrukten mit Order By in sich zusammen und sind ohnehin im praktischen Einsatz allenfalls marginal (kann sogar langsamer sein!!!)

D*B


Guten Morgen!

Herzlichen dank für die schnelle Antwort Fr. Birgitta.

Zum Punkt 1:
Schande über mein Haupt, ich war mir dessen nicht bewusst. Danke nochmals!

Punkt 2:
Da in der Protokollanzeige Filterungen möglich sind, setze ich mir den String bei Änderungen neu zusammen.

(#HK = ')


SqlStm = 'Select * from TSTPROT where STATUS like ' + #HK + %trim(bsStatus) + #HK + ' order by fNR DESC';Beim 1. Aufruf & falls mein Suchfeld leer ist befülle ich die Variable bsStatus mit '%'.

Falls ich hier mist zusammen rede (was sehr gut möglich ist) bitte ich das zu entschuldigen.